запутался с указателями
От: zaxs  
Дата: 09.04.02 10:49
Оценка:
вопрос не совсем из Визуал но я там с этим столкнулся %). Хочу чтобы функция изменяла двумерный массив. Использую такой код:
main()
{
char ** files;
vvod(&files);
}
vvod(char *** list)
{
int i,n=3;
for(i=0;i<n;i++) *list=(char **)calloc(n,sizeof(char *));
**(list+0)="zxcvb";
**(list+1)="asdfg";
**(lis t+2)="qwert";
}
Так вот а в main передается только первое значение массива, т.е. **(list+0).
files[0] = "zxcvb"; а вот files[1], files[2]="";
Подскажите как получать все значения ???
Re: запутался с указателями
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 09.04.02 11:06
Оценка:
Здравствуйте zaxs, Вы писали:

Z>main()

Z>{
Z>char ** files;
Z>vvod(&files);
Z>}
Z>vvod(char *** list)
Z>{
Z>int i,n=3;
Z>for(i=0;i<n;i++) *list=(char **)calloc(n,sizeof(char *));
Z>**(list+0)="zxcvb";
Z>**(list+1)="asdfg";
Z>**(lis t+2)="qwert";
Z>}
Z>Так вот а в main передается только первое значение массива, т.е. **(list+0).
Z>files[0] = "zxcvb"; а вот files[1], files[2]="";
Z>Подскажите как получать все значения ???

тут две ошибки
1) память надо выделять только один раз, а не три
2) вместо **(list + 0) должно быть *((*list) + 0)
vvod(char *** list)
{
  int n=3;
  *list=(char **)calloc(n,sizeof(char *));
  *(*list+0)="zxcvb";
  *(*list+1)="asdfg";
  *(*list+2)="qwert";
}


Но ИМХО вот такой код более понятен:
vvod(char *** list)
{
  int n=3;
  char ** l = (char **)calloc(n,sizeof(char *));
  l[0]="zxcvb";
  l[1]="asdfg";
  l[2]="qwert";
  *list = l;
}
Re: запутался с указателями
От: GYB  
Дата: 09.04.02 11:35
Оценка:
Здравствуйте zaxs, Вы писали:

Z>вопрос не совсем из Визуал но я там с этим столкнулся %). Хочу чтобы функция изменяла двумерный массив. Использую такой код:

Z>main()
Z>{
Z>char ** files;
Z>vvod(&files);
Z>}
Z>vvod(char *** list)
Z>{
Z>int i,n=3;
Z>for(i=0;i<n;i++) *list=(char **)calloc(n,sizeof(char *));
Z>**(list+0)="zxcvb";
Z>**(list+1)="asdfg";
Z>**(lis t+2)="qwert";
Z>}
Z>Так вот а в main передается только первое значение массива, т.е. **(list+0).
Z>files[0] = "zxcvb"; а вот files[1], files[2]="";
Z>Подскажите как получать все значения ???
Z>

Предлагаю вот такой пример:



#include <stdio.h>
#include <stdlib.h>

void  vvod( char *** list );
void vyvod( char *** list );


void main() {
  char **files;
  vvod( &files );
  vyvod( &files );
}

void vvod( char *** list ) {
  *list = (char**)calloc( 3, sizeof(char*) );
  (*list)[0] = "zxcvb";
  (*list)[1] = "asdfg";
  (*list)[2] = "qwert";
}

void vyvod( char *** list ) {
  for( int i = 0; i < 3; i++ ) printf( "*list[%d] = \"%s\"\n", i, (*list)[i] );
  getchar();
}
Re: запутался с указателями
От: Аноним  
Дата: 09.04.02 12:27
Оценка:
Здравствуйте zaxs, Вы писали:


typedef int TArray[5][10];


void ByRef(TArray &src)
{
for (int i=0; i<5; i++)
for (int j=0; j<10; j++)
src[i][j] = 1;
}

void ByPointer(TArray *src)
{
// ByRef(*src,2);
for (int i=0; i<5; i++)
for (int j=0; j<10; j++)
(*src)[i][j] = 2;
}

TArray src;

int main(int argc, char* argv[])
{
ByRef(src);
ByPointer(&src);
return 0;
}
Re: запутался с указателями
От: Gvido  
Дата: 09.04.02 22:40
Оценка:
Здравствуйте zaxs, Вы писали:

Z>вопрос не совсем из Визуал но я там с этим столкнулся %). Хочу чтобы функция изменяла двумерный массив. Использую такой код:

Z>main()
Z>{
Z>char ** files;
Z>vvod(&files);
Z>}
Z>vvod(char *** list)
Z>{
Z>int i,n=3;
Z>for(i=0;i<n;i++) *list=(char **)calloc(n,sizeof(char *));
Z>**(list+0)="zxcvb";
Z>**(list+1)="asdfg";
Z>**(lis t+2)="qwert";
Z>}
Z>Так вот а в main передается только первое значение массива, т.е. **(list+0).
Z>files[0] = "zxcvb"; а вот files[1], files[2]="";
Z>Подскажите как получать все значения ???
Z>

Очень много звездочек
:))
Можно сделать так:

void vvod(char** &files);

void main()
{
char** files;
vvod(files);
}

void vvod(char** &files)
{
int n = 3;

files = new char*[n];

files[0] = "zxcvb";
...
}

Тоже самое немного попроще, и ошибок поменьше :)
Re[2]: запутался с указателями
От: Аноним  
Дата: 10.04.02 04:43
Оценка:
Здравствуйте DarkGray.
Спасибо за подсказку поставил одну лишнюю звездочку за скобкой.
А три раза память выделять для char * было необходимо т.к. в настоящей функции строка присваивается динамически.
Т.е. под нее надо выделять память. А тут она выделяется неявно и это действиптельно лишнее.
Спасибо.
Re[2]: запутался с указателями
От: Аноним  
Дата: 10.04.02 04:48
Оценка:
Здравствуйте GYB.
Большое спасибо за науку.
Re[2]: запутался с указателями
От: Аноним  
Дата: 10.04.02 04:49
Оценка:
Здравствуйте Gvido.
Большое спасибо за науку.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.