获取错误:表达式不可分配

时间:2017-06-05 20:46:43

标签: c

我是C的新手,我找不到任何答案,说明为什么它会给我一个错误:{11}在第11行和第20行。

这是一个用于创建随机数组然后使用子例程对其进行排序的简单代码。我还在学习C,无法通过任何研究找到解决方案。

这是我的代码:

expression is not assignable

3 个答案:

答案 0 :(得分:3)

您没有正确取消引用指针。

第11行:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="width_25vw min-height_25vh bg_red">
</div>

第20行:

ptr[i] = rand();

或者,您可以指定if (ptr[i] > ptr[j]){ ptr[i] = ptr[j]; } 以获取*(ptr + i)的值。

答案 1 :(得分:1)

您使用的是旧式(标准前,K&amp; R风格)功能定义。你应该使用微弱的现代C90和后来的原型样式函数定义。

您写道:

int MakeRandArray(ptr, i)
{
    for (i = 0; i < n; i++) {
        (ptr + i) = rand()
    }
}

在此功能中,ptr的类型为inti的类型 - 它们被隐式输入int,因为您没有&#39 ; t指定类型。 (请注意,这些变量与全局变量ptri无关 - 它们只是隐藏全局变量。它们继承与全局变量相同的类型。)您应该将n传递给该函数,并且不应将i传递给该函数。你应该避免所有这些全局变量。

您立即编译错误是因为您忽略了*中的*(ptr + i),并且您还省略了语句末尾的;。你应该使用ptr[i]因为它更简单,更容易打字,更容易阅读,更可靠,并且通常比其他人更有益于每个人。

您声称自己的函数返回int;它什么都不返回。

因此,此函数的代码应为:

void MakeRandArray(int *ptr, int n)
{
    for (int i = 0; i < n; i++)
        ptr[i] = rand();
}

如果您愿意,可以将牙箍放在环体上;就个人而言,我不喜欢这样。在循环中定义i就像需要处理C99模式的编译器一样。如果您真的遇到困难,可以在循环之前定义int i;并从循环控制行中删除int。但是,你在Mac上;你不是那么坚持。

整个代码中都存在类似的问题。

// Syntactically valid; semantically dubious - it does not sort!
void SortArray(int *ptr, int n)
{
    for (int i = 0; i < n; i++)
    {
        int j = i + 1;
        if (ptr[i] > ptr[j])
            ptr[i] = ptr[j];
    }
}

int main(void)
{
    MakeRandArray(myArray, 100);
    SortArray(myArray, 100);
}

请注意,即使它应该编译,它也不会对数组进行排序。当然,您没有显示任何打印代码,因此您无法证明该数组是否已排序。你需要这样做。您可以编写一个函数来检查数组是否已排序。

你的sort函数需要在其中包含第二个循环,迭代j。您需要交换元素,而不是简单地覆盖它们。

您对n的定义是:

int n = sizeof(myArray);

这可能会将n设置为400.如果您想要数组的大小,则需要int n = sizeof(myArray) / sizeof(myArray[0]);,在此上下文中给出正确的答案。您应该可以不使用该变量,也可以使用全局iptr。你根本不使用SortedArraymyArray可以是main()的本地 - 这意味着您根本不需要全局变量。尽量避免全局变量;他们往往不是一个好主意。

答案 2 :(得分:1)

这是一个避免错误和-Wall警告的版本 我没有改变那些反对良好编码习惯的东西。花一些时间来了解这些。阅读您的问题的评论和这个答案。 作为一个安可,我让你的排序工作(以一种非常盲目,低效的方式)并添加了一台打印机,用于演示目的。为方便起见,我使用数组大小​​10而不是100。看来你打算保留orignal数组并创建一个排序版本,我把它留给你。

#include <stdio.h>
#include <stdlib.h>
    int myArray[10];
    int *ptr = myArray;
    // int i; Do not use globals for counters inside functions.

    // it would be better to give the size of arrays as an explicit
    // parameter to functions, instead of using a global variable
    // (keeping this only for minimised differences to your code)
    int n = sizeof(myArray)/sizeof(int);

void MakeRandArray(int *ptr)
{
    int i;
    for(i = 0; i < n; i++)
    {
        *(ptr + i) = rand();
    }
}

void PrintArray(int *ptr)
{
    int i;
    for(i = 0; i < n; i++)
    {
        printf("%8d\n", *(ptr + i));
    }
    printf("\n");
}


void SortArray(int *ptr)
{
    // this is far off even the simplest sorting algorithms
    // it is worth reading up on one (e.g. the quite simple bubble sort),
    // then enjoy optimising this (my) totally blind method here;
    // note that I sort within the original array,
    // you seem to intend to keep unsorted in addition to sorted
    int i;
    int j;
    for (j = 0; j < n; j++)
    {
        for (i = 0; i < n-1; i++)
        {   int help;
            if (*(ptr+i) > *(ptr + i + 1))
            {
                help = *(ptr+i);
                *(ptr + i) = *(ptr + i + 1);
                *(ptr + i + 1)=help;
            }
        }
    }
}    

int main(void)
{
    MakeRandArray(ptr);
    PrintArray(ptr);
    SortArray(ptr);
    PrintArray(ptr);

    return 0;
}

输出:

      41
   18467
    6334
   26500
   19169
   15724
   11478
   29358
   26962
   24464

      41
    6334
   11478
   15724
   18467
   19169
   24464
   26500
   26962
   29358