C 在循环中找不到以前声明的变量

C 在循环中找不到以前声明的变量,c,declaration,unused-variables,C,Declaration,Unused Variables,作为一个大学项目,我正在实施一个sha1饼干。 我正在尝试不同的值,并对它们的哈希值进行循环 for(int a=0; a<26; a++) { for(int b=0; b<26; b++) { for(int c=0; c<26; c++) { for(int d=0; d<26; d++) { for(int e=0; e<26; e

作为一个大学项目,我正在实施一个sha1饼干。 我正在尝试不同的值,并对它们的哈希值进行循环

for(int a=0; a<26; a++)
{
    for(int b=0; b<26; b++)
    {
        for(int c=0; c<26; c++)
        {
            for(int d=0; d<26; d++)
            {
                for(int e=0; e<26; e++)
                {

                    for(int f=0; f<26; f++)
                    {
                        result[0]=alphabet[a];
                        result[1]=alphabet[b];
                        result[2]=alphabet[c];
                        result[3]=alphabet[d];
                        result[4]=alphabet[e];
                        result[5]=alphabet[f];


                        //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e);

                        // Declarations
                        uint32_t a,b,c,d,e,temp;
                        uint32_t w[80]= {0};
                        a=h0;
                        b=h1;
                        c=h2;
                        d=h3;
                        e=h4;

for(int a=0;a您两次声明变量。每个
for(int x
声明变量。您应该能够将
uint32\u t a,b,c…
移出循环,并在第一个
for
之前,从每个for语句中删除
int

这应该是可编译的(我不知道代码是否可以工作,或者做您希望它做的事情,因为您似乎正在重置最内部循环中的循环变量):

uint32\u t a、b、c、d、e、temp;
uint32_t w[80]={0};

对于(a=0;a您将声明两次变量。每个
for(int x
声明变量。您应该能够将
uint32\u t a,b,c…
移出循环,在第一个
for
之前,并且需要从每个for语句中删除
int

这应该是可编译的(我不知道代码是否可以工作,或者做您希望它做的事情,因为您似乎正在重置最内部循环中的循环变量):

uint32\u t a、b、c、d、e、temp;
uint32_t w[80]={0};
对于(a=0;a
如果我现在尝试将uint32_t声明行移到第一个for循环之前(但仍在同一个函数中),C编译器会警告我变量未使用,并且程序会崩溃,因为这些变量似乎在循环中丢失

如果将uint32\u t a;uint32\u t b;…uint32\u t e;置于外部,然后重新声明为int a;int b;…int e;,则声明为uint32\u t类型的变量超出范围。在最内部的for循环中,变量a、b、…、e是在for语句中声明的变量。毕竟for循环中,int a、…、e超出范围,将使用uint32\u t变量。但它们没有指定给所需的值

如果将uint32_t声明放在内部for循环中,则uint32_t在范围内,而那些int在范围外(或者我应该说它们被“重写”)

但出于性能原因,我不想每次都将它们声明为新的

让编译器优化它,如果你真的想保持嵌套循环像现在。变量不被重新声明每次执行内环。你可以比较结果汇编代码。否则,请考虑JonathanLeffler的建议,将它们分离成函数,使你的代码更可读。< /P> 如果我犯了什么错误,请毫不犹豫地指出!谢谢

如果我现在尝试将uint32_t声明行移到第一个for循环之前(但仍在同一个函数中),C编译器会警告我变量未使用,并且程序会崩溃,因为这些变量似乎在循环中丢失

如果将uint32\u t a;uint32\u t b;…uint32\u t e;置于外部,然后重新声明为int a;int b;…int e;,则声明为uint32\u t类型的变量超出范围。在最内部的for循环中,变量a、b、…、e是在for语句中声明的变量。毕竟for循环中,int a、…、e超出范围,将使用uint32\u t变量。但它们没有指定给所需的值

如果将uint32_t声明放在内部for循环中,则uint32_t在范围内,而那些int在范围外(或者我应该说它们被“重写”)

但出于性能原因,我不想每次都将它们声明为新的

让编译器优化它,如果你真的想保持嵌套循环像现在。变量不被重新声明每次执行内环。你可以比较结果汇编代码。否则,请考虑JonathanLeffler的建议,将它们分离成函数,使你的代码更可读。< /P>
如果我犯了任何错误,请毫不犹豫地指出它/它们!谢谢!

您的循环控制变量是
a
f
(在循环中定义,如
for(int I=0;…)
);为什么要在内部上下文中重新定义它们?或者,当您将内部声明移到循环之外时,您将这些变量隐藏在内部循环中,而最外层的声明都未使用。您将声明变量两次。每个
都是(int x
声明变量。您应该能够将
uint32_t a,b,c…
移出循环,在第一个
for
之前,并且您需要从每个
for
语句中删除
int
。好吧,我稍后会清理这个@JonathanLeffler。迈克尔·沃尔兹:这是我描述中的一个输入错误,在代码t中声明正确。在开始编译之前,请将其清理干净。您需要重新考虑您尝试执行的操作。并使用函数。6个嵌套循环是一场噩梦,但您应该将最内部循环的主体放入函数中,特别是如果其中有更多循环。@HeatfanJohn我读错了您的答案。这就是解决方案我更改了循环变量的名称。如果您将此作为答案写入,我会将其标记为正确。您的循环控制变量是
a
f
(在循环中定义,如
for(int i=0;…)
);为什么要在内部上下文中重新定义它们?或者,当您将内部声明移到循环之外时,您将这些变量隐藏在内部循环中,而最外层的声明都未使用。您将声明变量两次。每个
都是(int x
声明变量。您应该能够将
uint32_t a,b,c…
移出循环,在第一个
for
之前,并且您需要从每个
for
语句中删除
int
。好吧,我稍后会清理这个@JonathanLeffler。迈克尔·沃尔兹:这是我描述中的一个输入错误,在代码t中他们声明是对的。在开始编译之前先把它清理干净。你需要重新考虑你要做什么。并且使用函数。6个嵌套循环是一场噩梦,但你应该把最里面的循环体放入
uint32_t a,b,c,d,e,temp;
uint32_t w[80]= {0};

for(a=0; a<26; a++)
{
    for(b=0; b<26; b++)
    {
        for(c=0; c<26; c++)
        {
            for(d=0; d<26; d++)
            {
                for(e=0; e<26; e++)
                {

                    for(f=0; f<26; f++)
                    {
                        result[0]=alphabet[a];
                        result[1]=alphabet[b];
                        result[2]=alphabet[c];
                        result[3]=alphabet[d];
                        result[4]=alphabet[e];
                        result[5]=alphabet[f];


                        //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e);

                        // Declarations
                        a=h0;
                        b=h1;
                        c=h2;
                        d=h3;
                        e=h4;
for(int a=0; a<26; a++)
{
    for(int b=0; b<26; b++)
    {
        for(int c=0; c<26; c++)
        {
            for(int d=0; d<26; d++)
            {
                for(int e=0; e<26; e++)
                {

                    for(int f=0; f<26; f++)
                    {
                        result[0]=alphabet[a];
                        result[1]=alphabet[b];
                        result[2]=alphabet[c];
                        result[3]=alphabet[d];
                        result[4]=alphabet[e];
                        result[5]=alphabet[f];


                        //printf("result : %s\n candidate %x %x %x %x %x",result,candidate.a,candidate.b,candidate.c,candidate.d,candidate.e);

                        uint32_t A,B,C,D,E,temp; // var "a" is not "A"
                        uint32_t w[80]= {0};


                        // Declarations
                        A=h0;
                        B=h1;
                        C=h2;
                        D=h3;
                        E=h4;