简体   繁体   English

将2D数组传递给C中的函数

[英]Passing 2D arrays to functions in c

I have a program where i read data, and store them in 1d and 2d arrays, and then pass them to a function to analyze it. 我有一个程序,我在其中读取数据,并将其存储在1d和2d数组中,然后将它们传递给函数进行分析。 I have problem with declaring/using 2d arrays and passing them to function. 我在声明/使用2D数组并将其传递给函数时遇到问题。

PROBLEMS: 1) if i use malloc to declare 2d array, then i get segmentation fault on the second col of first row when trying to store data in it. 问题:1)如果我使用malloc声明2d数组,则在尝试将数据存储在第一行的第二列时遇到分段错误。 but it will work fine if i declare it as array[][] 但如果我将其声明为array [] [],它将正常工作

2)i can't pass it to function, to use it. 2)我无法将其传递给功能,无法使用它。 there were different options here on the forum, tried them but it all ends up with errors stating the declared argument type and the variable i am passing doesn't have same data type. 论坛上有很多不同的选项,可以尝试一下,但最终都会出现错误,指出声明的参数类型,而我传递的变量没有相同的数据类型。

Full program below: 完整程序如下:

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

// Function declaration
void clearNewLines(void);
int match(int numStates, int numAlphabets, char *nameOfStates, char *nameOfAlphabets, char finalState,char *transitionTable, int stringLength,char *string);

int main(int argc, char *argv[]){

    // Number of states and number of alphabets of DFA
    int numStates;
    int numAlphabets;

    // Language string
    char *string;
    int stringLength;

    // Final state
    char finalState;

    // Read numStates 
    printf("Enter the number of STATES:");
    scanf("%d",&numStates);

    // Flush STDIN
    clearNewLines();

    // Array for name of alphabets, and name of states
    char *nameOfStates = malloc(numStates*sizeof(char));

    // Read the nameOfStates 
    int i;
    for(i=0;i<numStates;i++){

        if(i==0)
            printf("Enter name of states as numbers(1-9)\n");   

        printf("Name of STATES:");
        scanf("%c",&nameOfStates[i]);
        clearNewLines();

        //fgets(nameOfStates[i],2,stdin);
        //fgets(nameOfStates[i],2*sizeof(char),stdin);  

    }// End of for-loop to read nameOfStates

    // Read numAlphabets
    printf("Enter the number of ALPHABETS: ");
    scanf("%d", &numAlphabets);

    // Flush STDIN
    clearNewLines();

    // Array for name of alphabets, and name of states
    //char nameOfAlphabets[numAlphabets];   
    char *nameOfAlphabets = malloc(numAlphabets * sizeof(char));
    // Saving transition table
    //char **transitionTable = malloc(sizeof(char*) * numStates * numAlphabets);
    char transitionTable[numStates][numAlphabets];

    // Read name of alphabets
    int j;
    for(j=0;j<numAlphabets;j++){

        // Read the alphabets
        printf("Name of ALPHABETS:");
        scanf("%c",&nameOfAlphabets[j]);

        // Flush STDIN 
        clearNewLines(); 

    }// End for-loop to read alphabets

    // Get the transitionTable[states][alphabets] 
    int row;
    for(row=0;row<numStates;row++){

        int col;
        for(col=0;col<numAlphabets;col++){

            printf("Enter Transition From q%c to %c: ",nameOfStates[row],nameOfAlphabets[col]);
            scanf("%c",&transitionTable[row][col]);
            clearNewLines();
        }

    }// End of (outer) for-loop to store data in transition table

    // Get final state
    printf("Enter final state: ");
    scanf("%c",&finalState);
    clearNewLines(); 

    // Get language string
    printf("Enter the length of string: ");
    scanf("%d",&stringLength);
    clearNewLines();
    string = malloc(stringLength*sizeof(char));
    printf("Enter string: ");
    scanf("%s",string);
    clearNewLines();

    int result =  match(numStates, numAlphabets, nameOfStates, nameOfAlphabets, finalState, (char*)transitionTable, stringLength, string);


    return result;


}// End of main function


/*
*
*   match - check if a string matches a language
*/

int match(int numStates, int numAlphabets, char *nameOfStates, char *nameOfAlphabets, char finalState,char *transitionTable, int stringLength,char *string){


    char state;     // State of the machine
    char stringChar;// Character of string being processed
    int result;     // Result of the character processing

    result = 0;
    int i = 0;
    // initial state
    state = nameOfStates[0];
    stringChar = string[i];

    // Walk through the string, while doing the transition
    while(i < stringLength){

        int row;
        for(row=0;row<numStates;row++){

            if(state == nameOfStates[i]){
                break;
            }           
        }// End of for-loop to find the state

        int col;
        for(col=0;col<numAlphabets;numAlphabets++){

            if(stringChar == nameOfAlphabets[col]){
                break;
            }
        }// End of for-loop to find the alphabet

        state = transitionTable[row][col];
        // Next character   
        i++;
        stringChar = string[i];

    }// End of while-loop to go thorough the string characters of the language    

    // If in final state, then accepted, if not then rejected
    if(state == finalState){

        result = 1;
    }else{

        result = 0;
    }

    return result;

}// End of match function

/*
*
*   clearNewLines - clear any newline character present at the STDIN
*/
void clearNewLines(void)
{
    int c;
    do
    {
        c = getchar();
    } while (c != '\n' && c != EOF);
}

EDIT: I changed the program based on a suggestion ( function(array[first][second] ). Now it does pass the function but the array is empty. 编辑:我根据建议(function(array [first] [second])更改了程序。现在它确实通过了函数,但数组为空。

An easy solution is to declare your 2D array as an 1D array. 一个简单的解决方案是将2D数组声明为1D数组。 Let's say you want to pass as an argument a 10x20 array of integers to function foo : 假设您想将10x20的整数数组作为参数传递给foo函数:

void foo(int* a2Darray){
    ...
}

int* my2Darray = malloc(10*20*sizeof(*my2Darray)); //allocate your array as an 1D array
foo(my2Darray); //pass it as an argument

Then let's say you want to access the element [x,y] of your 2D array. 然后,假设您要访问2D数组的元素[x,y]。 This is performed by accessing the element x+10*y of the 1D array. 这是通过访问1D数组的元素x + 10 * y来执行的。

If the size of the array is not a constant, then you can also pass the size as arguments, by changing your function to : 如果数组的大小不是常数,则还可以通过将函数更改为来将大小作为参数传递:

void foo(int* a2Darray, int maxX, int maxY)

change 更改

int match(int numStates, int numAlphabets, char *nameOfStates, char *nameOfAlphabets, char finalState,char *transitionTable, int stringLength,char *string){

to

int match(int numStates, int numAlphabets, char *nameOfStates, char *nameOfAlphabets, char finalState,char transitionTable[numStates][numAlphabets], int stringLength,char *string){

at call 通话时

int result =  match(numStates, numAlphabets, nameOfStates, nameOfAlphabets, finalState, transitionTable, stringLength, string);

To pass this array to a function: 将此数组传递给函数:

char transitionTable[numStates][numAlphabets];

the function needs parameters: 该函数需要参数:

, size_t numAlphabets, char transitionTable[][numAlphabets],

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM