usando funciones en c (valor de retorno)

Aprendiendo C y teniendo muchas dudas.

Tengo una función (digamos, función 1) que llama a otra función (digamos función 2). La función 2 calcula una matriz de cadena.

¿Cómo puedo usar esta matriz en la función 1?

Algunos ejemplos de código:

int find_errors(char* word) { char error[100]; /*Given the word, It will find the duplicate chars and store it in the error array. */ return 0; } int find_word(char* word) { find_errors (word); printf("%s\n", error); return 0; } 

Hay al menos tres enfoques posibles:

  1. Usa una variable global
  2. pasar un parámetro entre ellos
  3. devuelve un puntero desde la función

Hay varias formas de hacer esto.

1) Cree una matriz dinámica y devuelva un puntero a la matriz. Esto requerirá que libere manualmente la memoria para la matriz en un momento posterior.

 #define NUM_ELEMS 50 // In find_error(): char* error = malloc(NUM_ELEMS * sizeof(char)); return error; // In find_word(): char *error = find_errors(); // do stuff free(error); 

2) Pase un puntero a find_errors que puede usar como la matriz de error. Esto no requerirá que libere manualmente la memoria.

 // In find_word(): char error[NUM_ELEMS]; find_error(error); 

3) Utilice una matriz global. Puede dificultar que otras personas entiendan su código. Tiene otros problemas potenciales también.

 // In global scope: char error[NUM_ELEMS]; 

Su pregunta se refiere a “llamada por referencia” y “llamada por valor”.

 char* getNewValsToSet(void) { char* new_vals = (char*) malloc(sizeof(char[5])); new_vals[4] = '\0'; return new_vals; } void setValuesEven(char* vals_to_set) { vals_to_set[0] = 'A'; vals_to_set[2] = 'C'; } void setValuesOdd(char* vals_to_set) { vals_to_set[1] = 'B'; vals_to_set[3] = 'D'; } int main(void) { char* some_vals_to_set = getNewValsToSet(); setValsEven(some_vals_to_set); setValsOdd(some_vals_to_set); // ... now has vals "ABCD" free(some_vals_to_set); //cleanup return 0; } 

Si tiene “dudas” sobre el aprendizaje de C, en mi humilde opinión es una de las mejores cosas que puede hacer (sin importar el idioma en el que trabaje) porque explicará exactamente cómo funcionan las cosas “debajo del capó” (que todos Los idiomas de nivel tratan de esconderse hasta cierto punto).

Debe declarar la matriz de error globalmente y usarla como lo hizo.

EDITAR: usar variables globales no es la mejor práctica en la mayoría de los casos, como este.

Este es un ejemplo de lo que está buscando con una salida de consola impresionante. Asigna dinámicamente la matriz para contener cualquier número de errores (caracteres duplicados en su caso) que puedan ocurrir.

 //Only free errors if result is > 0 int find_errors(char* word, char** errors) { int num_errors = 0; int word_length = strlen(word); int ARRAY_SIZE = MIN(8, word_length); char existing[word_length]; int existing_index = 0; *errors = NULL; for(int i = 0; i < word_length; i++) { char character = word[i]; //Search array for (int n = 0; n < word_length; ++n ) { if(n >= existing_index) { existing[n] = character; existing_index++; break; } if (existing[n] == character) { num_errors++; if(!*errors) *errors = (char*)malloc(ARRAY_SIZE * sizeof(char)); //Check if we need to resize array if(num_errors >= ARRAY_SIZE) { ARRAY_SIZE *= 2; ARRAY_SIZE = MIN(ARRAY_SIZE, word_length); char *tmp = (char*)malloc(ARRAY_SIZE * sizeof(char)); memcpy(tmp, *errors, (unsigned long)ARRAY_SIZE); free(*errors); *errors = tmp; } //Set the error character (*errors)[num_errors - 1] = character; break; } } } return num_errors; } int find_word(char* word) { char* errors; int errCount = find_errors (word, &errors); if(errCount > 0) { printf("Invalid Characters: "); for(int i =0; i < errCount; i++) { printf("%c ", errors[i]); } printf("\n"); free(errors); } return 0; } int main(int argc, char *argv[]) { find_word("YWPEIT"); find_word("Hello World"); find_word("XxxxXXxXXoooooooOOOOOOOOOOOOOOOooooooooOOOOOOOOOOOOooooooOOO"); }