5 Replies
      Latest reply on Dec 7, 2018 6:08 AM by Claude31
      robertovk Level 1 Level 1 (0 points)

        Hi, im do this code and i have this error. send help plis I do not know why happen. This error has appeared before me but I do not know what it means or why it happens to me, if someone can solve these doubts, I would be very grateful.

         

        ERROR:

        Ld /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug/ENT_4 normal x86_64 (in target: ENT_4)

            cd /Users/robertomanguezmartin/Documents/UNI_UC3M/ENT_4

            export MACOSX_DEPLOYMENT_TARGET=10.14

            /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -L/Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug -F/Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug -filelist /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Intermediates.noindex/ENT_4.build/Debug/ENT_4.build/Objects-normal/x86_64/ENT_4.LinkFileList -mmacosx-version-min=10.14 -Xlinker -object_path_lto -Xlinker /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Intermediates.noindex/ENT_4.build/Debug/ENT_4.build/Objects-normal/x86_64/ENT_4_lto.o -Xlinker -export_dynamic -Xlinker -no_deduplicate -Xlinker -dependency_info -Xlinker /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Intermediates.noindex/ENT_4.build/Debug/ENT_4.build/Objects-normal/x86_64/ENT_4_dependency_info.dat -o /Users/robertomanguezmartin/Library/Developer/Xcode/DerivedData/ENT_4-gofrayijplkjfxgysxvmiedjptwq/Build/Products/Debug/ENT_4

         

        Undefined symbols for architecture x86_64:

          "_stdscr", referenced from:

              _main in main.o

              _menu in main.o

          "_wgetch", referenced from:

              _main in main.o

              _menu in main.o

        ld: symbol(s) not found for architecture x86_64

        clang: error: linker command failed with exit code 1 (use -v to see invocation)

         

        CODE:

         

        #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>
        #include <curses.h>
        #include <string.h>
        
        #define FILAS 6
        #define COLUMNAS 7
        #define RAYAS 4
        #define MAXIMO 1
        #define MAX_PARTIDAS 3
        
        struct partida
        {
            char ficha_comienzo;
            int fichas;
            int ganador;
            int secuencia[FILAS*COLUMNAS];
        };
        void titulo(void);
        char menu(void);
        void creartablero(char [][COLUMNAS]);
        int numeromenos45(char [][COLUMNAS],int [][3]);
        int numero45(char [][COLUMNAS],int [][3],int);
        int numerov(char [][COLUMNAS],int[][3],int);
        int numeroh(char [][COLUMNAS],int[][3],int);
        void juego(char [][COLUMNAS], struct partida [ ], int);
        
        
        int main()
        {
            int i,j,k;
            char tablero[FILAS][COLUMNAS];
            int x=0;
            char opcionmenu;
            struct partida p[MAX_PARTIDAS];
            
            //Generar título
            titulo();
            
            
            //Rellenar tablero de espacios
            for(i=0;i<FILAS;i++)
            {
                for(j=0;j<COLUMNAS;j++)
                {
                    tablero[i][j]=' ';
                }
            }
            
            for(k=0;k<MAX_PARTIDAS && x!=1;k++)
            {
                opcionmenu=menu();
                
                switch(opcionmenu)
                {
                    case '1':
                        printf("Elige la ficha con la que comenzara el jugador 1: \n\n - x \n - o\n");
                        p[k].ficha_comienzo=getch();
                        while(p[k].ficha_comienzo!='x' && p[k].ficha_comienzo!='o')
                        {
                            printf("\nIntroduce una opcion valida. \n\n - x \n - o\n");
                            p[k].ficha_comienzo=getch();
                        }
                        creartablero(tablero);
                        juego(tablero, p,k);
                        
                        
                        break;
                    case '2':
                        break;
                    case '3':
                        break;
                    case '4':
                        x=1;
                }
                if (k==MAX_PARTIDAS-1)
                {
                    printf("Se ha alcanzado el maximo de partidas (%d)", MAX_PARTIDAS);
                }
            }
            
            
            
        }
        
        //Título función
        void titulo()
        {
            printf("╔");
            for(int i=0;i<28;i++)
            {
                printf("═");
            }
            printf("╗");
            
            printf("║ ENTREGABLE 4 - EJERCICIO 1 ║ \n");
            
            printf("╚");
            for(int i=0;i<28;i++)
            {
                printf("═");
            }
            printf("═ \n\n");
        }
        
        //Menú
        char menu()
        {
            char elegida;
            
            printf("Elige una de las siguientes opciones: \n\n1. Jugar partida \n2. Exportar partida \n3. Estadisticas \n4. Salir del programa \n");
            elegida=getch();
            while(elegida!='1' && elegida!='2' && elegida!='3' && elegida!='4')
            {
                printf("\nOpcion incorrecta.\n\n");
                printf("Elige una de las siguientes opciones: \n\n1. Jugar partida \n2. Exportar partida \n3. Estadisticas \n4. Salir del programa \n");
                elegida=getch();
            }
            return elegida;
        }
        
        //Generar el tablero
        void creartablero(char tablero[][COLUMNAS])
        {
            int i;
            int j;
            puts("");
            for(int n=0;n<COLUMNAS;n++)
            {
                printf(" %2d ",n+1);
            }
            
            printf("/n╔");
            for(int a=0;a<COLUMNAS-1;a++)
            {
                printf("═══╦");
            }
            printf("═══╗ /n");
            for(i=0; i<FILAS-1;i++)
            {
                for(j=0;j<COLUMNAS;j++)
                {
                    printf("║ %c ", tablero[i][j]);
                }
                printf("║");
                printf("%d \n",i+1);
                printf("╠");
                for(int a=0;a<COLUMNAS-1;a++)
                {
                    printf("═══╬");
                }
                printf("═══╣ /n");
            }
            
            for(int j=0;j<COLUMNAS;j++)
            {
                printf("║ %c ",tablero[FILAS-1][j]);
            }
            printf("║");
            printf("%d \n",FILAS);
            printf("╚");
            for(int a=1;a<=COLUMNAS-1;a++)
            {
                printf("═══╩");
            }
            printf("═══╝ /n");
        }
        
        //Detectar y contar -45º
        int numeromenos45(char cuadricula[][COLUMNAS],int posicion[][3])
        {
            int counter=0; //Saber cuantas "O" consecutivaas hay.
            int maxcounter=0; //Saber cuantas rayas de -45º hay.
            int i,j,k;
            
            for(i=0;i<FILAS-RAYAS+1;i++)//A partir de la fila FILAS-RAYAS+1 es imposible que empiece una raya de -45º, por tanto, en esas no busca.
            {
                for(j=0;j<COLUMNAS-RAYAS+1;j++)//A partir de la columna COLUMNAS-RAYAS+1 es imposible que empiece una raya de -45º, por tanto, en esas no busca.
                {
                    if(cuadricula[i][j]=='O')//Solo tomar en cuenta las rayas generadas por las "O"
                    {
                        if(j==0 || i==0) //Al estar en la primera fila o en la primera columna, no hay que verificar que el anterior sea distinto, pues en teoría no hay anterior.
                        {
                            //Verificar que el elemento que se encuentra en la diagonal -45º (cuadricula[i+k+1][j+k+1]) sea una "O" también, y que no se haya alcanzado el numero maximo de rayas.
                            for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i+k+1][j+k+1] && maxcounter<MAXIMO;k++)
                            {
                                counter++;//Por cada "O" detectada a continuación de la inicial, sumamos 1 al contador de "O" consecutivas.
                            }
                            if(counter>=RAYAS-1)//Si hay RAYAS-1 "O" consecutivas o más después de la "O" detectada al principio, significa que hay una raya.
                            {
                                //Meter en la correspondiente fila del array "resumen" la info de la raya detectada.
                                posicion[maxcounter][0]=i+1;
                                posicion[maxcounter][1]=j+1;
                                posicion[maxcounter][2]=0; //Como es una raya de -45º, ponemos un 0 en la última columna para identificarla.
                                maxcounter++;//Se suma 1 al contador de rayas detectads.
                            }
                        }
                        else //En el resto de filas y columnas, comprobamos que el elemento que el elemento anterior no sea una "O", para evitar que cuente varias veces una misma raya.
                        {
                            for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i+k+1][j+k+1] && cuadricula[i][j]!=cuadricula[i-1][j-1] && maxcounter<MAXIMO;k++)
                            {
                                counter++;
                            }
                            if(counter>=RAYAS-1)
                            {
                                posicion[maxcounter][0]=i+1;
                                posicion[maxcounter][1]=j+1;
                                posicion[maxcounter][2]=0;
                                maxcounter++;
                            }
                        }
                        counter=0; //Ponemos el contador de "O" consecutivas en 0 para que se repita el proceso.
                    }
                }
            }
            return maxcounter;//Devolvemos el numero de rayas detectads.
        }
        
        //Detectar y contar 45º
        int numero45(char cuadricula[][COLUMNAS], int posicion[][3], int total)//Esta vez se necesitará la variable total para saber en que parte del array "resumen" almacenar la info.
        {
            int counter=0;
            int maxcounter=0;
            int i,j,k;
            
            for(i=RAYAS-1;i<FILAS;i++)//Lo mismo de antes, solo que ahora empieza desde la fila RAYAS-1, pues en las anteriores es imposible que empiece una raya de 45º
            {
                for(j=0;j<COLUMNAS-RAYAS+1;j++)//Igual que antes.
                {
                    if(cuadricula[i][j]=='O')
                    {
                        if(j==0|| i==FILAS-1)//En la primera columna y en la última fila, no hay que verificar que el elemento anterior no sea una "O", pues en teoría no hay.
                        {
                            //El elemento que está en diagonal de 45º es el cuadricula[i-k-1][j+k+1], y hay que verificar que el total de rayas detectadas sea menor que el máximo.
                            for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j+k+1] && maxcounter+total<MAXIMO;k++)
                            {
                                counter++;
                            }
                            if(counter>=RAYAS-1)
                            {
                                //Como las posiciones que van desde 0 hasta total-1 ya están ocupadas, empezará a almacenar a partir de la fila "total".
                                posicion[maxcounter+total][0]=i+1;
                                posicion[maxcounter+total][1]=j+1;
                                posicion[maxcounter+total][2]=1;//Lo mismo de antes, pero esta vez se pone un 1 en la última columna, para identificarla como una raya de 45º
                                maxcounter++;
                            }
                        }
                        else
                        {
                            for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j+k+1] && cuadricula[i][j]!=cuadricula[i+1][j-1] && maxcounter+total<MAXIMO;k++)
                            {
                                counter++;
                            }
                            if(counter>=RAYAS-1)
                            {
                                posicion[maxcounter+total][0]=i+1;
                                posicion[maxcounter+total][1]=j+1;
                                posicion[maxcounter+total][2]=1;
                                maxcounter++;
                            }
                        }
                        counter=0;
                    }
                }
            }
            return maxcounter;
        }
        
        //Detectar y contar Verticales
        int numerov(char cuadricula[][COLUMNAS], int posicion[][3], int total)
        {
            int counter=0;
            int maxcounter=0;
            int i,j,k;
            
            for(i=RAYAS-1;i<FILAS;i++)//Comienza en la fila RAYAS-1, pues en las anteriores no puede empezar una raya.
            {
                for(j=0;j<COLUMNAS;j++)//No hay limitación, pues una raya vertical puede empezar en cualquier columna.
                {
                    if(cuadricula[i][j]=='O')
                    {
                        if(i==FILAS-1)//En la última fila no hay que verificar que el elemneto anterior sea distinto, pues en tería no hay.
                        {
                            //El elemento que está arriba de la "O" detectada es el cuadricula[i-k-1][j].
                            for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j] && maxcounter+total<MAXIMO;k++)
                            {
                                counter++;
                            }
                            if(counter>=RAYAS-1)
                            {
                                //Como las posiciones que van desde 0 hasta total-1 ya están ocupadas, empezará a almacenar a partir de la fila "total".
                                posicion[maxcounter+total][0]=i+1;
                                posicion[maxcounter+total][1]=j+1;
                                posicion[maxcounter+total][2]=2;//Lo mismo de antes, pero esta vez se pone un 2 en la última columna, para identificarla como una raya vertical.
                                maxcounter++;
                            }
                        }
                        else
                        {
                            for(k=0;k<RAYAS-1 && cuadricula[i][j]==cuadricula[i-k-1][j] && cuadricula[i][j]!=cuadricula[i+1][j] && maxcounter+total<MAXIMO;k++)
                            {
                                counter++;
                            }
                            if(counter>=RAYAS-1)
                            {
                                posicion[maxcounter+total][0]=i+1;
                                posicion[maxcounter+total][1]=j+1;
                                posicion[maxcounter+total][2]=2;
                                maxcounter++;
                            }
                        }
                        counter=0;
                    }
                }
            }
            return maxcounter;
        }
        
        //Detectar y contar horizontales
        int numeroh(char cuadricula[][COLUMNAS], int posicion[][3], int total)
        {
            int counter=0;
            int maxcounter=0;
            int i,j,k;
            
            for(i=0;i<FILAS;i++)//No hay limitación, pues una raya horizontal puede empezar en cualquier fila.
            {
                for(j=0;j<COLUMNAS-RAYAS+1;j++)//No toma en cuenta a partir de la columna COLUMNAS-RAYAS+1, pues es imposible que haya una raya horizontal
                {
                    if(cuadricula[i][j]=='O')
                    {
                        if(j==0)//En la primera columna no hay que verificar que el elemneto anterior sea distinto, pues en tería no hay.
                        {
                            //El elemento que está a la derecha de la "O" detectada es el cuadricula[i][j+k+1].
                            for(k=0;k<RAYAS && cuadricula[i][j]==cuadricula[i][j+k+1] && maxcounter+total<MAXIMO;k++)
                            {
                                counter++;
                            }
                            if(counter>=RAYAS-1)
                            {
                                //Como las posiciones que van desde 0 hasta total-1 ya están ocupadas, empezará a almacenar a partir de la fila "total".
                                posicion[maxcounter+total][0]=i+1;
                                posicion[maxcounter+total][1]=j+1;
                                posicion[maxcounter+total][2]=3;//Lo mismo de antes, pero esta vez se pone un 3 en la última columna, para identificarla como una raya horizontal.
                                maxcounter++;
                            }
                        }
                        else
                        {
                            for(k=0;k<RAYAS && cuadricula[i][j]==cuadricula[i][j+k+1] && cuadricula[i][j]!=cuadricula[i][j-1] && maxcounter+total<MAXIMO;k++)
                            {
                                counter++;
                            }
                            if(counter>=RAYAS-1)
                            {
                                posicion[maxcounter+total][0]=i+1;
                                posicion[maxcounter+total][1]=j+1;
                                posicion[maxcounter+total][2]=3;
                                maxcounter++;
                            }
                        }
                        counter=0;
                    }
                }
            }
            return maxcounter;
        }
        
        void juego(char tablilla[][COLUMNAS], struct partida q[], int numerop)
        {
            int a,k;
            printf("Jugador 1 elige una columna del 1 al %d",COLUMNAS);
            scanf("%d",&a);
            while(a>COLUMNAS || a<1)
            {
                printf("Esa columna no existe wey, deja de trolliarme jaja salu3");
                scanf("%d",&a);
            }
            for(k=0;k<FILAS && tablilla[k][a]==' ';k++)
            {
                if(k%2==0)
                {
                    tablilla[k][a]=q[numerop].ficha_comienzo;
                }
                else
                {
                    if(q[numerop].ficha_comienzo=='x')
                    {
                        tablilla[k][a]='o';
                    }
                    else
                    {
                        tablilla[k][a]='x';
                    }
                }
            }
            creartablero(tablilla);
        }