【问题标题】:How to input an array manually in a function in c?如何在c中的函数中手动输入数组?
【发布时间】:2014-12-03 20:48:27
【问题描述】:

在我的代码中存在以下函数:

int Count_border(int loc[], int search[], int search_c){
    int count = 0, i, j;


    for(j = -1; j < 2; j += 2){
        if(In_array(BOARD[loc[0] + j][loc[1]], search, search_c) == 1) count++;
    }
    for(j = -1; j < 2; j += 2){
        if(In_array(BOARD[loc[0]][loc[1] + j], search, search_c) == 1) count++;
    }


    return count;
}

在这个函数中,我在数组搜索中搜索值。对于这个问题,如何完成并不重要。但是,我的问题是,如何输入“手动”数组,如下所示:Count_border(con_input, {-1, 0, 1}, 3);

编译器不允许此语法。而且我不想在函数之前创建一个数组,我真的想硬编码它。

感谢您的帮助!

编辑:

现在我收到此错误:

In function 'main':
file.c:40:1: error: expected ';' before '}' token
 }
 ^
file.c:85:1: error: expected declaration or statement at end of input
 }

这是我的全部代码,请帮帮我。

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

void Put(int letter, int number);
void Set(int letter, int number, int who);
void Init_board();
int Count_border(int loc[], int search[], int search_c);
int In_array(int val, int arr[], int size);

int BOARD[9][9]; // 0 = empty, 1 = me, 2 = enemy
int STONES[2][81][9][9], STONE_COUNTER[2];

int main(void){
    char input[5];
    int con_input[2], t;

    Init_board();
    memset(STONES, 0, sizeof(STONES));
    memset(STONE_COUNTER, 0, sizeof(STONE_COUNTER));
    scanf("%s", input);
    if(strcmp(input,"Start") == 0){
        Put(4, 4);
    }

    scanf("%s", input); //get the first input after start

    do{
        con_input[0] = input[0]-'a';        /* Convert the input */
        con_input[1] = input[1];
        Set(con_input[0], con_input[1], 2);

        t = Count_border(con_input, (int[]){-1, 0, 1}, 3);
        printf("%i\n", t);

        scanf("%s", input);                 /* Get the next input */
    } while(strcmp(input, "Quit") != 0)


}

void Init_board(){
    int i,j;
    memset(BOARD, -1, sizeof(BOARD));
    for(i = 0; i < 9; i++){
        for(j = 0; j < 9; j++){
            BOARD[i][j] = 0;
        }
    }
}

void Put(int letter, int number){
    char t = letter + 'a';
    printf("%c%i\n", t, number);
    //fflush(stdout);
    Set(letter, number, 1);
}

void Set(int letter, int number, int who){
    BOARD[letter][number] = who;
}

int Count_border(int loc[], int search[], int search_c){
    int count = 0, i, j;


    for(j = -1; j < 2; j += 2){
        if(In_array(BOARD[loc[0] + j][loc[1]], search, search_c) == 1) count++;
    }
    for(j = -1; j < 2; j += 2){
        if(In_array(BOARD[loc[0]][loc[1] + j], search, search_c) == 1) count++;
    }


    return count;
}

int In_array(int val, int arr[], int size){
    int i;
    for (i=0; i < size; i++) {
        if (arr[i] == val)
            return 1;
    }
    return 0;
}



/* notes:
fflush(stdout);

*/

【问题讨论】:

    标签: c arrays function input


    【解决方案1】:

    如果您有 C99(或更新的)编译器,只需这样做

    Count_border(con_input, (int[]){-1, 0, 1}, 3);
    

    这个 (int[]){ something } 在 C 行话中被称为复合文字,它定义了一个临时对象(这里是一个包含 3 个元素的 int 数组),您可以将其传递给您的函数。

    【讨论】:

    • 因为我要参加比赛,并且不允许使用 C99
    • @GenieKort:它适用于 C99 和 C11;它在 C89/C90 中不起作用,这是一家知名编译器、操作系统和办公软件供应商提供的所有功能。
    • @GenieKort,你确定不允许 C99 是指 C11?知道谁如此进步会很有趣。
    • 好吧,实际上我对 C 编译器版本了解不多;)。哪里有好的解释?
    【解决方案2】:

    这样的?

    #include <stdio.h>
    
    void f(char arr[]);
    
    int main(int argc, char *argv[])
    {
            f((char [4]){'1', '2', '3', '5'});
    
            return 0;
    } 
    
    void f(char arr[4])
    {
            int i;
            for (i = 0; i < sizeof(arr)/sizeof(*arr); i++)
                    printf("%c ", arr[i]);
            putchar('\n');
    }
    

    【讨论】:

    • 您应该说明您使用的是 C99/C11 复合文字。如果数组大小不是 4,那么代码会发生什么,或者您如何解决这个问题也是值得考虑的。
    • 我认为复合字面量的使用时间太长了,以至于很难找到它们不起作用的地方。但你是对的。至于数组大小,我不知道这是否是一个好的解决方案(请参阅更新)。你怎么看?
    • 你和微软的 Windows 编译器没什么关系,那么......它们仍然不支持 C99 功能,例如复合文字(事实上,它们不能正确支持大多数C99)。
    • 至于你的重写,它会巧合地在 32 位系统上工作,但在 64 位系统上失败,因为 sizeof(arr)sizeof(char *) 相同,它是 8 而不是 4。你可能需要将大小作为参数传递:void f(int n, char arr[n]) { for (size_t i = 0; i &lt; n; i++) printf("%c ", arr[i]); putchar('\n'); },然后使用f(4, (char[]){'1', '2', '3', '5'});。绕过手动调整大小是很棘手的。一种选择是丑陋的:#define ARG_ARRAY ((char []){'1', '2', '3', '5'}) 加上 f(sizeof(ARG_ARRAY)/sizeof(ARG_ARRAY[0]), ARG_ARRAY);,但丑陋是有效的术语。
    • 我确信在函数参数中指定元素的数量应该与在声明中的工作方式相同,因为编译器有关于元素数量的信息。把灰撒在我头上。
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2017-12-14
    • 2012-12-27
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多