2013-11-25 6 views
1

творю новый вопрос, потому что я счел, что другая тема, чтобы мой один о моей предыдущей проблеме здесь: Trouble looping through arrays define in other source filesПасс ссылки не сохраняя его целочисленное значение

Проблема я тока есть в том, что я прохожу в значение size_t по ссылке на другую функцию, тогда я устанавливаю значение указанного size_t внутри этой функции, которое затем вы можете использовать в другой функции.

Проблема, с которой я столкнулся, заключается в том, что когда я передаю переменную size_t, функция, которая устанавливает значение, устанавливает его значение правильно, но когда я возвращаюсь к исходному файлу, где объявлена ​​переменная, он снова имеет «случайные» значения.

У кого-нибудь есть идеи, почему это происходит?

system_handler.c

size_t ship_size; 
size_t asset_size; 

mayday_call* mday_ptr; 
ship* ship_ptr; 
rescue_asset* assets_ptr; 

mday_ptr = read_mayday_file(); 
ship_ptr = read_ship_locations(&ship_size); 
assets_ptr = read_recuse_assets(&asset_size); 

printf("ships size : %d\n", ship_size); 
printf("assets size : %d\n", asset_size); 

ship.c

ship* read_ship_locations(size_t* size){ 
//no_of_lines is an unsigned int 
//locof is a char array containing a file name 
    no_of_lines = (count_lines(locof) -1); 
    printf("number of lines = %d \n", no_of_lines); 


    size = (unsigned int)no_of_lines; 
    size = no_of_lines; 

} 

rescue_assets.c

rescue_asset* read_rescue_assets(size_t* size) { 
    //no_of_lines is an unsigned int 
    //locof is a char array containing a file name 
    no_of_lines = count_lines(locof); 
    printf("number of lines = %d \n", no_of_lines); 

    assets = calloc(no_of_lines,sizeof (rescue_asset)); 

    size = (unsigned int)no_of_lines; 

    printf("size : %d\n", size); 
} 

Консоль Выход:

please enter the file name for the ship locations data: 
ships_1.txt 
number of lines = 4 
size : 4 
Please enter the file name for the rescue assets data: 
rescue_assets.txt 
number of lines = 37 
size : 37 
ships size : 134513984 
assets size : 0 
+6

Упс! Нет пропуска по ссылке в C !! – haccks

ответ

9

Как сказал комментатор, C не поддерживает реальную передачу по ссылке; вам нужно передать адрес переменной и использовать его как указатель в теле функции. Если size объявлен как указатель на size_t, вам нужно обратиться к нему таким образом явно:

*size = (size_t)no_of_lines; 

вместо

size = (size_t)no_of_lines; 

EDIT: Компиляция с gcc -Wall будет выдавать предупреждение о тип броска, который будет иметь пролить свет на эту проблему.

+1

+1 Включение предупреждений должно помочь поймать это, поэтому вы можете добавить это к своему ответу. Например, 'gcc' будет предупреждать * присваивание делает указатель из целого без cast *. –

+0

@alk a cast to 'size_t' все равно будет генерировать предупреждение, и не все задания будут выполняться. –

+0

Мне нужен размер * в параметре?когда я устанавливаю * размер в параметре и * размер в теле функции, значение размера становится равным -1bn. Я даже добавил cast_ size_t. –

3

Как прокомментировал hacce: в C. нет пропущенных ссылок. Когда вы передаете адреса своих size_t, они просто таковы: адреса. Когда вы затем назначаете no_of_lines в size в read_ship_locations, вы меняете этот адрес локально. Вам нужно разыменовать адрес и назначить, что вместо:

*size = no_of_lines; 

Подсказка: Я предполагаю, что вы бросили no_of_lines к (unsigned int), потому что компилятор предупреждает о преобразовании Int к указателю, если вы этого не сделаете. Когда компилятор предлагает бросить, где вы его не намеревались, почти всегда не решение проблемы. В этом случае: когда вы назначаете no_of_lines на size, вы назначаете intsize_t *, и это не очень хорошая идея, так как адрес no_of_lines, скорее всего, недействителен.

+0

поэтому вместо unsigned int следует изменить тип возвращаемого значения и тип переменной no_of_lines в size_t? даже когда я отбрасываю его (size_t), я получаю значение -1billion для размера –

+0

u нужно делать * size =, not size = – pm100

+0

Это сработало, я использовал% d not% zu при печати! Ага! –

Смежные вопросы