Доброго всем времени суток.
Подскажите пожалуйста как решить проблему.
Есть следующий код, функция ch меняет содержимое двумерного массива char.
В MSVC7 данный код чудесно компилится и работает, но мне нужно его откомпилить на HP-UX компилятором c89.
Но вот тут и проблема, при попытке компиляции c89 отображается сообщение ошибки компиляции
cc: "test.c", line 4: error 1000: Unexpected symbol: "&".
cc: "test.c", line 23: error 1000: Unexpected symbol: "&".
#include "stdlib.h"
#include "stdio.h"
void ch(char **&i);
int _tmain()
{
char **buf = NULL;
printf("%p\n",buf);
ch(buf);
printf("%p\n",buf);
printf("\n%s", buf[0]);
printf("\n%s", buf[1]);
printf("\n%s", buf[2]);
return 0;
}
void ch(char **&i)
{
i = (char**)malloc(3*sizeof(char*));
i[0] = (char*)calloc(6,sizeof(char));
i[1] = (char*)calloc(6,sizeof(char));
i[2] = (char*)calloc(6,sizeof(char));
strcpy(i[0],"test1");
strcpy(i[1],"test2");
strcpy(i[2],"test3");
}
Соответственно нужно использовать тройной указатель — void ch(char ***i);
Но вот тут загвоздка — не получается выделить нормально память под элементы массива в данном случае. Программа выпадает в кору.
Пробовал так:
void ch(char ***i)
{
*i = (char**)malloc(3*sizeof(char*));
*i[0] = (char*)calloc(6,sizeof(char));
*i[1] = (char*)calloc(6,sizeof(char));
*i[2] = (char*)calloc(6,sizeof(char));
strcpy(*i[0],"test1");
strcpy(*i[1],"test2");
strcpy(*i[2],"test3");
}
Но видимо что-то неправильно. Раньше не сталкивался с подобной задачей.
Буду очень благодарен за ответ.
добавлена разметка — Кодт
Здравствуйте, almos, Вы писали:
A>Но вот тут и проблема, при попытке компиляции c89 отображается сообщение ошибки компиляции
A> *i[0] = (char*)calloc(6,sizeof(char));
Не угадали со скобками
*i[0] это указатель на нулевой элемент массива i. Вам нужен нулевой элемент массива, который получается из разыменнованного i, это делатся так: (*i)[0].
(*i)[0] = (char*)calloc(6,sizeof(char));
strcpy((*i)[0], "test1");
Здравствуйте, Tilir, Вы писали:
T>Здравствуйте, almos, Вы писали:
A>>Но вот тут и проблема, при попытке компиляции c89 отображается сообщение ошибки компиляции
A>> *i[0] = (char*)calloc(6,sizeof(char));
T>Не угадали со скобками
T>*i[0] это указатель на нулевой элемент массива i. Вам нужен нулевой элемент массива, который получается из разыменнованного i, это делатся так: (*i)[0].
T>T>(*i)[0] = (char*)calloc(6,sizeof(char));
T>strcpy((*i)[0], "test1");
T>
Спасибо!
Правда я уже сам дошел до верного решения, вскоре после опубликования сообщения

.
Здравствуйте, almos, Вы писали:
A>Доброго всем времени суток.
A>Подскажите пожалуйста как решить проблему.
A>Есть следующий код, функция ch меняет содержимое двумерного массива char.
A>В MSVC7 данный код чудесно компилится и работает, но мне нужно его откомпилить на HP-UX компилятором c89.
A>Но вот тут и проблема, при попытке компиляции c89 отображается сообщение ошибки компиляции
A>cc: "test.c", line 4: error 1000: Unexpected symbol: "&".
A>cc: "test.c", line 23: error 1000: Unexpected symbol: "&".
A>#include "stdlib.h"
A>#include "stdio.h"
A>void ch(char **&i);
A>int _tmain()
A>{
A> char **buf = NULL;
A> printf("%p\n",buf);
A> ch(buf);
A> printf("%p\n",buf);
A> printf("\n%s", buf[0]);
A> printf("\n%s", buf[1]);
A> printf("\n%s", buf[2]);
A> return 0;
A>}
A>void ch(char **&i)
A>{
A> i = (char**)malloc(3*sizeof(char*));
A> i[0] = (char*)calloc(6,sizeof(char));
A> i[1] = (char*)calloc(6,sizeof(char));
A> i[2] = (char*)calloc(6,sizeof(char));
A> strcpy(i[0],"test1");
A> strcpy(i[1],"test2");
A> strcpy(i[2],"test3");
A>}
A>Соответственно нужно использовать тройной указатель — void ch(char ***i);
A>Но вот тут загвоздка — не получается выделить нормально память под элементы массива в данном случае. Программа выпадает в кору.
A>Пробовал так:
A>void ch(char ***i)
A>{
A> *i = (char**)malloc(3*sizeof(char*));
A> *i[0] = (char*)calloc(6,sizeof(char));
A> *i[1] = (char*)calloc(6,sizeof(char));
A> *i[2] = (char*)calloc(6,sizeof(char));
A> strcpy(*i[0],"test1");
A> strcpy(*i[1],"test2");
A> strcpy(*i[2],"test3");
A>}
A>Но видимо что-то неправильно. Раньше не сталкивался с подобной задачей.
A>Буду очень благодарен за ответ.
Компилятор похоже не справляется с типами, нужно указать явно...
((char**)(*i))[0] = (char*)calloc(6,sizeof(char));
((char**)(*i))[1] = (char*)calloc(6,sizeof(char));
((char**)(*i))[2] = (char*)calloc(6,sizeof(char));
strcpy(((char**)(*i))[0],"test1");
strcpy(((char**)(*i))[1],"test2");
strcpy(((char**)(*i))[2],"test3");