Ayuda compilando en C.

Tengo un libro de C del año 1990 traducido.

El libro es ISBN: 84-283-1502-7 Langage C de Phillipe Dax.

En el mismo hay un programa titulado "programa para cuadrados mágicos de orden impar".

Lo escribí tanto en Gedit como Jedit (eso no es de mucha importancia) y compilé con el comando y opciónes:

$ gcc -o archivo archivo.c

El programa escrito por mí es:

/* programa para cuadrados mágicos de orden impar */

#define MAX 13
int cuadrado[MAX][MAX]; /*tabla externa*/
main()
{
	int i;
	int j;
	int k;
	int n;
	printf ('dame el orden del cuadrado mágico :');
	scanf ('%d',&n);
	if ( n<=2 || n>MAX || n%2==0 )
		printf ('el orden del cuadrado es incorrecto\n');
	else {
			pacuadrado(n);
			j = n/2; i = j-1;
			k = 1;
			cuadrado[i][j] = k;
			i-- ; j++ ; k++ ;
			while ( k <= n*n ) { 
				if (i < 0) i = n-1;
				if (j < 0) j = n-1;
				if (j> =n) j = 0;
				if (cuadrado[i][j] == 0) {
					cuadrado[i][j] = k;
					i-- ; j++ ; k++;
				}
				else {
					i-- ;  j-- ;
				}
			}
			impcuadrado(n);
		}
}
pacuadrado(n)
int n;
{	registrer i,j;
	for (i=0 ; i <= n-1 ; i++)
		for (j=0 ; j <= n-1 ; j++) cuadrado[i][j] = 0;
}
impcuadrado(n)
int n;
{ 	registrer i,j,suma;
	for (i=0 ; i <= n-1 ; i++ {
			for (suma=0 , j=0 ; j <= n-1 ; j++)
				printf(' %4d',cuadrado[i][j];
					suma += cuadrado[i][j];
	}
	printf(' %4d\n',suma);
	printf ('\n')
	for (j=0 ; j <= n-1 ; j++ {
			for (suma=0 , i=0 ; i <= n-1 ; i++) suma += cuadrado[i][j];
			printf(' %4d',suma);
	}
}

El programa en el libro es:

http://www.mediafire.com/?3otaf2lsgdvj2wi

Luego de compilarlo me aparece el siguiente error

lucas@debian:~/Desktop$ gcc -o archivo archivo.c 
archivo.c: In function ‘main’:
archivo.c:11: warning: incompatible implicit declaration of built-in function ‘printf’
archivo.c:11:10: warning: character constant too long for its type
archivo.c:11: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
archivo.c:11: note: expected ‘const char *’ but argument is of type ‘int’
archivo.c:12: warning: incompatible implicit declaration of built-in function ‘scanf’
archivo.c:12:9: warning: multi-character character constant
archivo.c:12: warning: passing argument 1 of ‘scanf’ makes pointer from integer without a cast
archivo.c:12: note: expected ‘const char *’ but argument is of type ‘int’
archivo.c:14:11: warning: character constant too long for its type
archivo.c:14: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
archivo.c:14: note: expected ‘const char *’ but argument is of type ‘int’
archivo.c:24: error: expected expression before ‘=’ token
archivo.c: In function ‘pacuadrado’:
archivo.c:38: error: ‘registrer’ undeclared (first use in this function)
archivo.c:38: error: (Each undeclared identifier is reported only once
archivo.c:38: error: for each function it appears in.)
archivo.c:38: error: expected ‘;’ before ‘i’
archivo.c:39: error: ‘i’ undeclared (first use in this function)
archivo.c:40: error: ‘j’ undeclared (first use in this function)
archivo.c: In function ‘impcuadrado’:
archivo.c:44: error: ‘registrer’ undeclared (first use in this function)
archivo.c:44: error: expected ‘;’ before ‘i’
archivo.c:45: error: ‘i’ undeclared (first use in this function)
archivo.c:45: error: expected ‘)’ before ‘{’ token
archivo.c:47:12: warning: multi-character character constant
archivo.c:50:9: warning: character constant too long for its type
archivo.c:54:11: warning: multi-character character constant
archivo.c:56: error: expected declaration or statement at end of input
lucas@debian:~/Desktop$ 

Me llama la atención que un programa escrito en un libro no funcione. Asimismo pensé que al ser algo viejo puede que no este "adaptado".

Lo mismo me pasó con el mismo libro y un programa que calcula números primos por la criba de Erastótenes. Con él se muestra y compara lenguajes de programación diversos como por ej:
C, ada, Fortran, Forth, basic, cobol y pascal. Lo escribí tanto en C, como en fortran y ada, pero ninguno funcionó.

Imagen de patagonian18
+1
0
-1

Hola:

En una revisión rápida, lo que veo es que te faltó incluir la librería que contiene a la función printf, al principio del programa:

#include stdio.h

Dentro de las funciones pacuadrado(n) y impcuadrado(n), las variables i y j no están declaradas.
En la linea 24 hay un espacio que no debería existir entre el mayor que y el igual (debería ser >=).
Saludos.

+1
0
-1

 

mi blog: www.patagonianuser.blogspot.com

Ad augusta per angusta

Imagen de Lucas 6534
+1
0
-1

Ok. Gracias. Luego lo voy a editar y veré que sucede.

+1
0
-1
Imagen de cousteau
+1
0
-1

Hmm... un pelín antiguo ese libro, no usa ni siquiera ANSI C... quizá estaría mejor usar al menos "El lenguaje de programación C", de Kernighan y Ritchie. La sintaxis esa es bastante rara para lo que se usa habitualmente.

Ahora el programa en sí:

  • Primero, las cadenas se delimitan con "...", no con '...'; eso es sólo para caracteres. De ahí la mitad de warnings.
  • Segundo, lo que ha dicho patagonian18: #include <stdio.h>
  • Tercero, es >=, no puedes poner >  =
  • Cuarto, es register, no registRer. De todas formas yo directamente usaría int.
  • Quinto, me parece que tienes que declarar pacuadrado() e impcuadrado() antes del main() para poder usarlas (no hace falta poner toda la función, basta con el prototipo y luego puedes poner la función al final, si te parece más elegante).
  • Sexto, te has comido un ) en las líneas 45 y 52, después del ++.
  • Séptimo, aargh, se nota que el libro es antiguo. Esa sintaxis ya no se usa. Aunque en principio sigue siendo válida, te recomiendo cambiar
    main() { ...
    pacuadrado(n) int n; { ...
    

    por

    int main(void) { ...
    void pacuadrado(int n) { ...
    
  • Octavo, al final de int main(void), pon siempre return 0;
+1
0
-1

«E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem» significa que dpkg se ha interrumpido y que tienes que ejecutar "sudo dpkg --configure -a" para corregir el problema.
Imagen de Lucas 6534
+1
0
-1

jajaj, me hizo reir mucho tu comentario.

Bien, probaré arreglando con tus observaciónes.

Es como el catalán y el castellano ¿no? jajaj. bien, gracias por todo. Luego comento con el resultado.

+1
0
-1
Imagen de Lucas 6534
+1
0
-1

Bien.
He modificado el fuente con las observaciónes Nº 2,3,4,7,8.

Estoy muy emocionado por empezar a entender algo de C. ¡¡¡Ya llegará el año que viene y todo a puro código!!!.

En fin,
¿me podés dar un ejemplo de la observación Nº1? y en qué líneas por favor.

y ¿ para declarar la variable uso #define? ¿ alguna idea de qué agregarle en esa sección? ya que no se me ocurre nada para declararla.

Te presento el nuevo código:

/* programa para cuadrados mágicos de orden impar */
#include 
#define MAX 13
int cuadrado[MAX][MAX]; /*tabla externa*/
int main(void){
	int i;
	int j;
	int k;
	int n;
	printf ('dame el orden del cuadrado mágico :');
	scanf ('%d',&n);
	if ( n<=2 || n>MAX || n%2==0 )
		printf ('el orden del cuadrado es incorrecto\n');
	else {
			pacuadrado(n);
			j = n/2; i = j-1;
			k = 1;
			cuadrado[i][j] = k;
			i-- ; j++ ; k++ ;
			while ( k <= n*n ) { 
				if (i < 0) i = n-1;
				if (j < 0) j = n-1;
				if (j >= n) j = 0;
				if (cuadrado[i][j] == 0) {
					cuadrado[i][j] = k;
					i-- ; j++ ; k++;
				}
				else {
					i-- ;  j-- ;
				}
			}
			impcuadrado(n);
		}
}
return 0;
void pacuadrado(int n)
int n;
{	register i,j;
	for (i=0 ; i <= n-1 ; i++)
		for (j=0 ; j <= n-1 ; j++) cuadrado[i][j] = 0;
}
void impcuadrado(int n)
int n;
{ 	register i,j,suma;
	for (i=0 ; i <= n-1 ; i++) {
			for (suma=0 , j=0 ; j <= n-1 ; j++)
				printf(' %4d',cuadrado[i][j];
					suma += cuadrado[i][j];
	}
	printf(' %4d\n',suma);
	printf ('\n')
	for (j=0 ; j <= n-1 ; j++ {
			for (suma=0 , i=0 ; i <= n-1 ; i++) suma += cuadrado[i][j];
			printf(' %4d',suma);
	}
}

root@debian:/home/lucas/Desktop# gcc -o archivo archivo.c
archivo.c:10:10: warning: character constant too long for its type
archivo.c: In function ‘main’:
archivo.c:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
/usr/include/stdio.h:339: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c:11:9: warning: multi-character character constant
archivo.c:11: warning: passing argument 1 of ‘scanf’ makes pointer from integer without a cast
/usr/include/stdio.h:428: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c:13:11: warning: character constant too long for its type
archivo.c:13: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
/usr/include/stdio.h:339: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c: At top level:
archivo.c:35: error: expected identifier or ‘(’ before ‘return’
archivo.c:36: warning: conflicting types for ‘pacuadrado’
archivo.c:15: note: previous implicit declaration of ‘pacuadrado’ was here
archivo.c: In function ‘pacuadrado’:
archivo.c:36: error: old-style parameter declarations in prototyped function definition
archivo.c: At top level:
archivo.c:42: warning: conflicting types for ‘impcuadrado’
archivo.c:32: note: previous implicit declaration of ‘impcuadrado’ was here
archivo.c: In function ‘impcuadrado’:
archivo.c:42: error: old-style parameter declarations in prototyped function definition
archivo.c:47:12: warning: multi-character character constant
archivo.c:47: error: expected ‘)’ before ‘;’ token
archivo.c:49: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
/usr/include/stdio.h:339: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c:49: error: expected ‘;’ before ‘}’ token
archivo.c:50:9: warning: character constant too long for its type
archivo.c:50: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
/usr/include/stdio.h:339: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c:51: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
/usr/include/stdio.h:339: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c:52: error: expected ‘;’ before ‘for’
archivo.c:54:11: warning: multi-character character constant
archivo.c:56: error: expected declaration or statement at end of input
root@debian:/home/lucas/Desktop# 

Gracias por sus ayudas. : )

+1
0
-1
Imagen de Goyo
+1
0
-1

¿ para declarar la variable uso #define?

No. ¿Tu libro no explica cómo se declaran variables y cómo se usa #define?

¿ alguna idea de qué agregarle en esa sección?

¿Por qué quieres agregar algo en alguna sección?

ya que no se me ocurre nada para declararla.

No es cuestión de ocurrencia sino de conocer el lenguaje (leer el libro).

+1
0
-1
Imagen de Lucas 6534
+1
0
-1

No sé por qué en este foro no postea (no aparece directamente, pero está).

+1
0
-1
Imagen de cousteau
+1
0
-1

printf ("dame el orden del cuadrado mágico :");
        ^                                   ^

No es un capricho; es que en C " y ' son cosas completamente diferentes.

+1
0
-1

«E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem» significa que dpkg se ha interrumpido y que tienes que ejecutar "sudo dpkg --configure -a" para corregir el problema.
Imagen de cousteau
+1
0
-1

Cambia

}
return 0;

por

     return 0;
}

Cambia
void pacuadrado(int n) int n; {
void impcuadrado(int n) int n; {

por

void pacuadrado(int n) {
void impcuadrado(int n) {

Pon esto antes del main:
void pacuadrado(int n);
void impcuadrado(int n);
int main(void) { ...

Te sigue faltando el ) de for (j=0 ; j <= n-1 ; j++) (hacia el final del archivo)
Arregla esto:
for (suma=0 , j=0 ; j <= n-1 ; j++) {
    printf(' %4d',cuadrado[i][j]);
    suma += cuadrado[i][j];
}

(sin las llaves, el suma += cuadrado[i][j]; sólo se llevará a cabo al terminar el bucle for)

+1
0
-1

«E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem» significa que dpkg se ha interrumpido y que tienes que ejecutar "sudo dpkg --configure -a" para corregir el problema.
Imagen de cousteau
+1
0
-1

Échale un vistazo a este link, a lo mejor encuentras algún libro interesante:
http://www.iso-9899.info/wiki/Books
(quizá "The C book" esté bien para empezar... no lo he leído)

+1
0
-1

«E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem» significa que dpkg se ha interrumpido y que tienes que ejecutar "sudo dpkg --configure -a" para corregir el problema.
Imagen de Lucas 6534
+1
0
-1

Bueno, he compilado lo siguiente

/* programa para cuadrados mágicos de orden impar */
#include 
#define MAX 13
int cuadrado[MAX][MAX]; /*tabla externa*/
void pacuadrado(int n);
void impcuadrado(int n);
int main(void){
	int i;
	int j;
	int k;
	int n;
	printf ("dame el orden del cuadrado mágico :");
	scanf ('%d',&n);
	if ( n<=2 || n>MAX || n%2==0 )
		printf ('el orden del cuadrado es incorrecto\n');
	else {
			pacuadrado(n);
			j = n/2; i = j-1;
			k = 1;
			cuadrado[i][j] = k;
			i-- ; j++ ; k++ ;
			while ( k <= n*n ) { 
				if (i < 0) i = n-1;
				if (j < 0) j = n-1;
				if (j >= n) j = 0;
				if (cuadrado[i][j] == 0) {
					cuadrado[i][j] = k;
					i-- ; j++ ; k++;
				}
				else {
					i-- ;  j-- ;
				}
			}
			impcuadrado(n);
		}
}
	return 0;
void pacuadrado(int n)
{	register i,j;
	for (i=0 ; i <= n-1 ; i++)
		for (j=0 ; j <= n-1 ; j++) cuadrado[i][j] = 0;
}
void impcuadrado(int n)
{ 	register i,j,suma;
	for (i=0 ; i <= n-1 ; i++) {
			for (suma=0 , j=0 ; j <= n-1 ; j++)
				printf(' %4d',cuadrado[i][j]);
					suma += cuadrado[i][j];
	}
	printf(' %4d\n',suma);
	printf ('\n')
	for (j=0 ; j <= n-1 ; j++) 
			for (suma=0 , i=0 ; i <= n-1 ; i++) suma += cuadrado[i][j];
			printf(' %4d',suma);
}

y todavía no consigo un resultado sactisfactorio.

root@debian:/home/lucas/Desktop# gcc -o archivo archivo.c
archivo.c:13:9: warning: multi-character character constant
archivo.c: In function ‘main’:
archivo.c:13: warning: passing argument 1 of ‘scanf’ makes pointer from integer without a cast
/usr/include/stdio.h:428: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c:15:11: warning: character constant too long for its type
archivo.c:15: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
/usr/include/stdio.h:339: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c: At top level:
archivo.c:37: error: expected identifier or ‘(’ before ‘return’
archivo.c:47:12: warning: multi-character character constant
archivo.c: In function ‘impcuadrado’:
archivo.c:47: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
/usr/include/stdio.h:339: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c:50:9: warning: character constant too long for its type
archivo.c:50: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
/usr/include/stdio.h:339: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c:51: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
/usr/include/stdio.h:339: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
archivo.c:52: error: expected ‘;’ before ‘for’
archivo.c:54:11: warning: multi-character character constant
archivo.c:54: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast
/usr/include/stdio.h:339: note: expected ‘const char * __restrict__’ but argument is of type ‘int’
root@debian:/home/lucas/Desktop# 

Muchas gracias por ayudarme costeau y patagonian18.
Voy a guardar el archivo modificado para estudiarlo y seguirlo arreglando en el futuro, cuando ya haya estudiado en la universidad el lenguaje de manera más profunda.

Muchos errores sintácticos, como cerrar el paréntesis, comillas dobles o simples, llaves, &cétera son una fiel copia del libro. El lenguaje al parecer cambió moderadamente en algunos aspectos. No se realmente si esos errores son enrealidad errores de sintaxis o viejas formas de escribir en el lenguaje. (en cuanto al paréntesis me suena mucho más a error de escritura.)
Nos vemos, suerte.

+1
0
-1
Imagen de cousteau
+1
0
-1

Cambia TODAS las comillas simples por dobles, no sólo las del primer printf. TODAS.
Las comillas simples sólo se usan para indicar caracteres sueltos, no cadenas (ni siquiera cadenas de un sólo carácter). Un carácter es un tipo de dato parecido a un entero pero de menor tamaño (aunque puedes asignar un entero a un carácter y viceversa). Una cadena es una secuencia de caracteres.

Y tienes que poner el return 0; inmediatamente antes del } de cierre de main(), no después.

Ahora pone

   }
}
  return 0;

y tiene que poner

   }
  return 0;
}
+1
0
-1

«E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem» significa que dpkg se ha interrumpido y que tienes que ejecutar "sudo dpkg --configure -a" para corregir el problema.
Imagen de Lucas 6534
+1
0
-1

SIII
¡El programa funciona!

Gracias costeau.
Lo corrí y funciona (el tema es que no tengo idea que valor darle jajaj) .
nuevamente gracias.

+1
0
-1