Tripple pointer
От: almos  
Дата: 04.06.09 10:58
Оценка:
Доброго всем времени суток.

Подскажите пожалуйста как решить проблему.

Есть следующий код, функция 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");
}

Но видимо что-то неправильно. Раньше не сталкивался с подобной задачей.

Буду очень благодарен за ответ.

добавлена разметка — Кодт
Re: Tripple pointer
От: Tilir Россия http://tilir.livejournal.com
Дата: 04.06.09 11:18
Оценка:
Здравствуйте, 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");
Re[2]: Tripple pointer
От: almos  
Дата: 04.06.09 11:20
Оценка:
Здравствуйте, 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>


Спасибо!
Правда я уже сам дошел до верного решения, вскоре после опубликования сообщения .
Re: Tripple pointer
От: Caracrist https://1pwd.org/
Дата: 04.06.09 11:30
Оценка:
Здравствуйте, 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");
~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.