Отслеживание рекурсии в C -- c поле с участием recursion поле с участием console пол Связанный проблема

Tracing Recursion in C


1
vote

проблема

русский

У меня есть базовое понимание рекурсивных функций и отслеживания, но что-то идет Haywire, когда я пытаюсь проследить следующую программу:

 <код> #include <stdio.h> #include <stdlib.h>  int f1(int *a, int c);  int main(void) {     int a=2, b=3, c=4, d=5;     a = f1(&c, f1(&b,d));     printf("a= %d b= %d c= %d d= %d ",a,b,c,d);      system("pause");     return 0; }  int f1(int *a, int c) {     *a = c - 2;     c = c*2 - (*a);     printf("a= %d c= %d ", *a, c);     return c - *a; }   

Когда я отслеживаю, я получаю два звонка F, F (4,4) и F (3,5). Я могу правильно проследить значения возврата, а оператор printf в функции f. Но окончательный распечаток в Main дает мне a = 4 b = 3 c = 2 d = 5, когда я пишу ее, я окажусь от C = 4 ... даже после того, как у меня есть двойной, а тройной проверил мою работу. Когда я отладкой, я не могу найти, когда значение основного «C» меняется, и я, конечно, не вижу никакой арифметики в коде для Main's «C».

Спасибо заранее ... у меня есть что-то маленькое, что я с видом на.

Английский оригинал

I have a basic understanding of recursive functions and tracing, but something is going haywire when I try to trace the following program:

#include <stdio.h> #include <stdlib.h>  int f1(int *a, int c);  int main(void) {     int a=2, b=3, c=4, d=5;     a = f1(&c, f1(&b,d));     printf("a= %d b= %d c= %d d= %d ",a,b,c,d);      system("pause");     return 0; }  int f1(int *a, int c) {     *a = c - 2;     c = c*2 - (*a);     printf("a= %d c= %d ", *a, c);     return c - *a; } 

When I trace, I get two calls to f, f(4,4) and f(3,5). I can trace the return values correctly and the printf statement in the f function. But the final printf in main gives me a= 4 b= 3 c= 2 d= 5 when I write it out I end up with c=4... even after I have double and triple checked my work. When I debug I cant find when the value of the main "c" changes and I certainly dont see any arithmetic in the code for main's "c".

Thanks in advance... I have a feeling its something small that I'm overlooking.

</div
        
     
     

Список ответов

1
 
vote
vote
Лучший ответ
 

Попробуйте так:

 <код> if($("#someElement").data("datepicker") != null){    // datepicker initialized } 2  

<Сильные> Выход

 <код> if($("#someElement").data("datepicker") != null){    // datepicker initialized } 3  
 

Try like this:

#include <stdio.h> #include <stdlib.h>  int f1(int *a, int c, const char *sa);  int main(void) {     int a=2, b=3, c=4, d=5;     a = f1(&c, f1(&b,d, "main.b"), "main.c");     printf("a= %d b= %d c= %d d= %d ",a,b,c,d);      system("pause");     return 0; }  int f1(int *a, int c, const char *sa) {   printf("%d: set %s from %d to %d ", __LINE__, sa, *a, c - 2);    *a = c - 2;   c = c*2 - (*a);   printf("a= %d c= %d ", *a, c);    return c - *a;  } 

Output

16: set main.b from 3 to 3 a= 3 c= 7 16: set main.c from 4 to 2 a= 2 c= 6 a= 4 b= 3 c= 2 d= 5 
</div
 
 
2
 
vote

<код> main() 's <код> c собирается измениться прямо здесь:

 <код> int f1(int *a, int c) {     *a = c - 2; /* <-- */     c = c*2 - (*a);     printf("a= %d c= %d ", *a, c);     return c - *a; }   

Во внешнем вызове <код> f1 , вы передаете указатель на <код> c . В f1 , при назначении <код> *a , он обновляет все, что <код> a указывал на <код> c .

.
 

main()'s c is going to change right here:

int f1(int *a, int c) {     *a = c - 2; /* <-- */     c = c*2 - (*a);     printf("a= %d c= %d ", *a, c);     return c - *a; } 

In the outer call to f1, you're passing a pointer to c. In f1, when you assign *a, it updates whatever a was pointing to, which is c.

</div
 
 
1
 
vote

Вызов <код> a = f1(&c, f1(&b,d)); прошедший адрес <код> c0 к <код> c1 и в этой функции первая строка

 <код> c2  

Изменяет значение <код> c3 . <Код> c4 относится к значению <код> c5 .

 

Call a = f1(&c, f1(&b,d)); passed address of c to f1() and in that function the first line

*a = c - 2; 

changes the value of c. *a refers to value of c.

</div
 
 

Связанный проблема

53  Как реализовать продолжения?  ( How to implement continuations ) 
Я работаю над схемой переводчика, написанный в C. В настоящее время он использует стек времени выполнения C в качестве собственного стека, который представляе...

0  Реализация ARP Smooth  ( Implementing arp sweep ) 
Я играю с libpcap / jpcap. Реализация Sweeper ARP. Я отправляю запрос на все IP в блоке до вещательного адреса и чтения ответов. Теперь я не могу думать о том...

0  Подсчет и сортировка в C  ( Counting and sorting in c ) 
Я заряжаюсь с обычной программой C, которая подсчитывает ряд входов и соответственно классифицирует их. У меня на самом деле нет ни одного кода, написанного д...

0  Где хранятся переменные указателя и как компилятор доступа к нормальной переменной? [закрыто]  ( Where the pointer variables are stored and how compiler access normal variable ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт. Этот вопрос не соответствует Рекомендациям переполнения ...

1  Проблемы с проверкой программы. Пожалуйста помоги!  ( Issues with program validation please help ) 
// Ребята у меня есть проблемы с моим кодом и разрывая мои волосы, пытаясь решить это. Вопрос в том, что я пытаюсь подтвердить свой код, поэтому он не рассчит...

0  Как остановить программу хранения более одного символа в переменную CHAR? [Дубликат]  ( How to stop a program from storing more than a single character into a char vari ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

0  Структура в C- Чтобы добавить атрибут во время выполнения?  ( Structure in c to add a attribute at runtime ) 
Как добавить переменную / атрибут участника на структуру из основного в C? ...

0  Если безымянный семафор инициализируется в общей памяти, Shm_unlink () уничтожает семафор?  ( If an unnamed semaphore is initialized in shared memory does shm unlink destr ) 
Я использую POSIX SEMAPHORES и совместную память для координации одного производителя и одного потребительского буфера. Я хочу полностью инициализировать эту ...

1  Lnk2001: неразрешенный внешний символ _maincrtstartup  ( Lnk2001 unresolved external symbol maincrtstartup ) 
Я пытаюсь скомпилировать пример Win32 Parrot Ardrone SDK V1.8, используя Visual Studio 2012 Express для Windows Desktop. Я использую Windows 7 64-бит. SDK нап...

7  Как портировать родной C-код на Android  ( How to port native c code on android ) 
Кто-нибудь может сказать мне, как портировать нативную программу C на платформе Android ..умел ли я включить некоторые библиотеки C или как именно ...? Спас...

78  Srand () - зачем называть это только один раз?  ( Srand why call it only once ) 
Этот вопрос о комментарии в этом вопросе Рекомендуемый способ инициализации Srand? Первый комментарий говорит, что <код> srand() следует вызывать только од...

0  Ошибка сборки Android NDK  ( Android ndk build error ) 
Я написал маленькую Hello World Program в C, а вот это <код> circ.onclick = { e: dom.MouseEvent => ... } 0 Вот файл make <код> circ.onclick = { e: dom....

42  Как я могу легко увидеть график C / C ++ #include? [закрыто]  ( How can i see the c c include graph easily ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт. Этот вопрос не соответствует Рекомендациям переполнения ...

2  Состояние не удалось для ldrloaddll  ( Status failed for ldrloaddll ) 
Я пытаюсь разрабатывать функцию ldrloaddll и мне не повезло с этим .. Я также проушинул для некоторых примеров, нет никакой много документации или правильного...

-1  Могу ли я использовать бесплатно () формально в VS2013?  ( Can i use free formally in vs2013 ) 
<код> #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #define TSIZE 45 struct film{ char title[TSIZE]; int ...