0

Error en la linea 49,[Error] invalid conversion from 'int' to 'int (*)[4]' [-fpermissive]

Además en códigos elaborados anteriormente, siguiendo el mismo propósito de este código, los caracteres siendo letras mayúsculas o minúsculas o números, estos se almacenaban como si fuesen caracteres especiales

Cabe recalcar que mis conocimientos sobre programación son pocos ya que voy en 2do semestre de preparatoria

#include <conio.h>
#include <windows.h>
#include <stdio.h>
using namespace std;
void gotoxy(int x, int y);
void Presenta(int Mayus[][4],int Minus[][4],int Dig[][4],int Esp[][4]);
void Ident(char Cadena[],int L);
const char Letrero[]="Identificar el tipo de caracter.";
int main(){
    int J,I,L;
    char Cadena[3][4];
    system("cls");
    gotoxy(20,1);printf("%s",Letrero);

    for(J=0;J<=3;J++)
    {
        gotoxy(20+J,5);printf("Rellene el vector %d: ",J);
        for(I=0;I<=4;I++)
        {
            gotoxy(20,5+I);printf("Rellene el vector %d: ",J);
            gotoxy(20,5+I);printf("Inserte la palabra %d: ",I);
            gotoxy(20,7+I);scanf("%s",Cadena[I][J]);
            int L=strlen(Cadena[I]);
        }
    }

    Ident(Cadena[I],L);
    return 0;
}
void Ident(char Cadena[][4],int L)
{
    int Mayus=0,Minus=0,Dig=0,Esp=0,I,J;

    for(I=0;I<=3;I++)
    {
    for(J=0;J<=4;J++)
    {
    if((Cadena[I][J]>='A')&&(Cadena[I][J]<='Z'))
    Mayus++;
    if((Cadena[I][J]>='a')&&(Cadena[I][J]<='z'))
        Minus++; 
        if((Cadena[I][J]>='0')&&(Cadena[I][J]<='9'))
            Dig++;    
            else
            Esp++;
    }
    }
    Presenta(Mayus,Minus,Dig,Esp);//aqui se presenta el error
}
void Presenta(int Mayus[][4],int Minus[][4],int Dig[][4],int Esp[][4])
{
    int I;
    for(I=0;I<=3;I++)
    {
    gotoxy(20,4+I);printf("Mayuscula:%i",Mayus[I]);
    gotoxy(20,5+I);printf("Minuscula:%i",Minus[I]);
    gotoxy(20,6+I);printf("Digito:%i",Dig[I]);
    gotoxy(20,7+I);printf("Especial:%i",Esp[I]);
    }
    gotoxy(20,20);printf("Presiona ENTER para SALIR");
    getche();
}
void gotoxy(int x, int y)
{   HANDLE hCon;
    hCon=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD dwPos;
    dwPos.X=x;
    dwPos.Y=y;
    SetConsoleCursorPosition(hCon,dwPos);
}

No ha sido posible compilar el código aún, así que posiblemente se presenten errores de lógica.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Solamente un comentario sobre las etiquetas. Cuando uses la etiqueta dev-c++ realmente deberías de estar refiriendo a una pregunta sobre el IDE, en este caso la etiqueta correcta es C++. Pasa seguido también con Java y Netbeans. – Eduardo Jiménez May 03 '21 at 03:11

1 Answers1

0

El código que presentas, si todo va bien, debería provocar dolores de cabeza y esguinces de dendritas a tu yo del futuro. Con toda sinceridad: es un código terrible. Difícil de leer, difícil de entender, difícil de mantener y difícilmente será correcto.

Respecto al error que recibes, es claro y conciso. Tal vez no lo entiendas por estar en inglés así que lo traduciré:

invalid conversion from 'int' to 'int (*)[4]'
conversión de 'int' a 'int (*)[4]' no válida

El compilador te advierte que estás intentando convertir un tipo de dato entero (int) a un puntero a una formación de cuatro enteros (int (*)[4]) lo cuál obviamente no es posible, tan obvio como que el compilador tiene razón pues estás pasando estas variables:

int Mayus=0,Minus=0,Dig=0,Esp=0,I,J;
//  ^^^^^   ^^^^^   ^^^   ^^^

A esta función:

void Presenta(int Mayus[][4],int Minus[][4],int Dig[][4],int Esp[][4]);
//            ^^^      ^^^^^ ^^^      ^^^^^ ^^^    ^^^^^ ^^^    ^^^^^

La función recibe cuatro parámetros el tipo de todos ellos es "puntero a formación de cuatro enteros" así que no puedes pasarle cuatro parámetros de tipo "entero".

Propuesta.

Tu código necesita un rediseño completo, si la idea es contar cuantos caracteres hay de cada tipo tu función Ident debería tener este aspecto:

using matriz = char[3][4];

void Ident(const matriz &m, int &Mayus, int &Minus, int &Dig, int &Esp)
{
    for (const auto &fila : matriz)
    {
        for (const auto &caracter : fila)
        {
            if ((caracter >='A') && (caracter <='Z'))
                ++Mayus;
            else if ((caracter >='a') && (caracter <='z'))
                ++Minus;
            else if ((caracter >='0') && (caracter <='9'))
                ++Dig;
            else
                ++Esp;
        }
    }
}

Recibe los datos como referencia constante y también recibe cuatro variables por referencia para ser rellenadas en la función, puede usarse así:

int main()
{
    int Mayus = 0, Minus = 0, Dig = 0, Esp = 0;
    char caracteres[3][4] { '4', 'B', 'c',
                            'd', '3', 'F',
                            '6', 'H', '|',
                            '/', '<', '7' };

    ident(caracteres, Mayus, Minus, Dig, Esp);

    std::cout << "Mayuscula: " << Mayus
              << "Minuscula: " << Minus
              << "Digito: " << Dig
              << "Especial: " << Esp;

    return 0;
}

Otras cosas a tener en cuenta.

  • Tu código es , no deberías programar como si fuese :
    • No uses <conio.h> ni <stdio.h>, lee este hilo para saber por qué.
    • printf es la herramienta de comunicación con consola de C, en C++ se usa std::cout.
  • Es una buena práctica hacer que las variables estén declaradas tan cerca de su punto de uso como sea posible, así que no declares variables al principio de la función para usarlas a mitad de la misma. En especial las variables de control de bucles: decláralas en el bucle.
  • Deja respirar a tu código, apretujar varias instrucciones en una línea no hará que tu código sea mejor, más bien al contrario.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82