PDA

Ver la versión completa : Dudas con programación en C



Haohmaru
24/11/2012, 10:18
Hola buenos días,

Actualmente estoy desarrollando un posible juego para NGPC. El lenguaje que estoy usando es C, ya que solo se permite trabajar en C o en ensamblador para esta consola. Realmente antes de ponerme con ello, nunca había programado en C, pero bueno, como en la actualidad programo con C#, tiré por este.

Tengo una dudilla a ver si alguien me la puede aclarar.

En una parte de código que estoy desarrollando, estoy intentando unir unos strings y también intentando concatenar a un string, un número entero. Me he puesto a mirar por internet algun manual y tal y siempre termino encontrando explicaciones para C++, y no me aclaro.

Luego veo por otro lado, el uso de la funcion strcat, que uno un string al fina lde otro. Veo que esta función viene de la clase string.h y mi duda es...¿De dónde saco yo esta clase? No dispongo de ningún framework en C, solo dispongo del framework para trabajar con la NGPC y listo.

¿Existe algún repositorio o algo para obtener esta clase y otras? ¿Son compatibles con C?

Gracias.

Kripto
24/11/2012, 10:58
-En C no hay clases.
-Creo que string viene por defecto en C, sólo hay que incluirla con el include correspondiente
-Debes de hacer un casting para pasar el entero a string

^MiSaTo^
24/11/2012, 11:04
En C no hay un tipo string, sino que tendrás que usar un array de char (dinámico o no).
strings.h que son las funciones tipo strcat, o strcopy (no se si las he escrito bien, lo digo de memoria y estoy recién levantada xDDD) y no siempre está disponible.
Para concatenar cadenas, yo usaba sprintf. Tienes un ejemplo de cómo hacerlo aquí: http://c.conclase.net/librerias/?ansifun=sprintf
(por cierto que te recomiendo esa web como referencia)

PD: Espero que te lleves bien con los punteros, porque te vas a hinchar xD

juanvvc
24/11/2012, 11:05
Una corrección de terminología: C no tiene clases, así que string.h no es una clase sino una librería de funciones. Aunque en realidad no es una librería sino una parte concreta de una librería, la libc. Ésta libc es la librería estándar de C y debería estar disponible en todos los sistemas excepto si tiene muy pocos recursos, que bien podría ser el caso de la NGPC (lo desconozco)

Ahora la duda: C es un lenguaje de bajo nivel, y más aún si no tienes acceso a la librería estándar. Concatenar cadenas es algo a lo que estamos acostumbrados en alto nivel, pero se complica un poco más cuando bajas al hardware.

Una cadena es una lista de posiciones de memoria seguidas. Si tienes dos cadenas, entonces tienes dos listas de posiciones de memoria ocupadas. Y si quieres unirlas, entonces necesitas una tercera lista de posiciones de memoria tan larga como la suma de las otras dos. Así que el proceso es el siguiente:

1.- contar cuantos caracteres hay en las cadenas iniciales. Digamos que una es de n caracteres y la otra de m (recuerda contar el caracter final: "hola" no tiene cuatro caracteres, tiene 5 contando el último que marca el final de la cadena)
2.- reserva n+m-1 espacios de memoria correlativos (cuenta bien: (n-1) caracteres visibles en la primera cadena, (m-1) caracteres visibles en la segunda, una marca de final de cadena. En total (n-1)+(m-1)+1=n+m-1). Esto se hace normalmente con otra función de la librería estándar: malloc. Si no tienes librería estándar, entonces tendrás que programar a mano las funciones de manejo de memoria: reserva, liberación...
3.- Copia la primera cadena en los primeros n-1 bytes de la nueva cadena, y la segunda a partir del byte n hasta el n+m-2. Pon el byte n+m-1 de la nueva cadena a cero (es la marca de fin de cadena)

Como ves, concatenar cadenas a bajo nivel es algo complejo y más si no tienes acceso a la librería estándar porque te tienes que gestionar tú la memoria. En este caso, lo más normal es NO CONCATENAR CADENAS, y de hecho es lo que se hacía en los videojuegos. ¿Te has dado cuenta de que en los RPG de la SNES o la Gameboy el nombre tiene una longitud determinada obligatoria? Eso es porque las cadenas son fijas: cuando quieres saludar tienes una cadena llamada "¡Buenos días XXXXX!" y la personalizas cuando llega el momento sustituyendo el XXXXX por el nombre del jugador CRONO. Sustituir y no concatenar, porque concatenar cadenas es un follón :D

javu61
24/11/2012, 11:51
unir unos strings y también intentando concatenar a un string, un número entero.

#include "stdlib.h" // Incluimos las definiciones de la librería estandar stdlib, para el manejo de la entrada/salida
#include "string.h" // Incluimos las definicones de la librería estándar string, para el manejo de cadenas

main(){
int i, numero=50;
char cadena[30];
char cadena1[30];
char cadena2[10];

itoa(numero,cadena,10); // Esto convierte un entero a una cadena de caracteres, 10=decimal, puedes usar otros valores para otros sistemas de numeración
i = sprintf (cadena, "%d", numero); // Esto pone en cadena la salida de impersión, usando el formado indicado, en i tenemos el nro de caracteres (opcional)

strcat(cadena1, cadena2); // Esto concatena tras el \0 de cadena1 el contenido de cadena2
// Ojo que en C no hay control, si strlen(cadena1)+strlen(cadena2) es mayor que lo que cabe en cadena1, se sobreecribe lo que
// haya detrás en memoria.
strcpy(cadena1, cadena2); // Esto copia cadena2 en cadena1, reemplazándola, pero siempre hasta el \0 de la cadena. Nuevamente no hay control, si sobrepasa
// sobreescribe memoria.
}



Veo que esta función viene de la clase string.h y mi duda es...¿De dónde saco yo esta clase?


En C no hay clases, sino librerías de funciones, cuando uses una debes incluir las definciones de la librería de las variables globales y las definiciones de funciones que se van a usar, el compilador no hace nada en tiempo de compilación, pero luego incluye automáticamente las librería necesaria, que ya está compilada, en el tiempo de enlace.

Puedes tener algún problema de que una librería entera no exista en tu compilador, o que alguna función concreta de esa librería se llame de otra forma, no exista o cambien los parámetros, pero en general se suelen respetar las librerías estándar.

Saludos

GameMaster
24/11/2012, 12:16
puedes usar tambien memcpy o sprintf

xzakox
24/11/2012, 12:39
El compilador de C que conozco para NGPC si que tiene la librería estándard de C, asi que puedes usar string.h sin problemas.

Como te dicen aqui, con incluir la cabecera con #include <string.h> al principio del archivo, y usando las funciones de la misma, no tendrias problemas,
un ejemplo:
http://www.cplusplus.com/reference/cstring/strcat/

Como bien dice, tienes que tener en cuenta que estás usando C, no C#, las strings no son dinámicas, son arrays de char, que en C tienen una longitud definida al crearse (o al reservar memoria para ellos), por lo que la cadena destino, tiene que tener tamaño suficiente para albergar la concatenación de las dos cadenas.

En el enlace que te he puesto, tienes el resto de la librería de C (a la izquierda, "Reference: C library") con buenos ejemplos.

Puedes ir probando en tu ordenador (con un compilador de C, puedes bajarte por ejemplo el IDE Code::Blocks), y probar compilando cosas para PC antes de hacerlo directamente en NGPC que será mucho más dificil hacer debug cuando estás aprendiendo lo básico.

Ya nos cuentas.

Haohmaru
24/11/2012, 22:23
Vaya no esperaba unas respuestas tan claras, la verdad es que me habeis resuelto varias dudas que tenía incluso algunas extras. Mi "mala" costumbre es la de trabajar bajo POO, ya que nunca he trabajado con lenguajes a bajo nivel.

Actualmente voy desarrollando cosillas poco a poco para la pocket y la verdad es que gestionar cualquier cosilla se hace un poco tediosa y me resulta una programación más lineal que la OPP, pero es lo que hay jejejeje.

Gracias por las aclaraciones con el tema de string.h, lo tenía entendido como una clase aunque bien explicado como comenta juanvc está mucho más claro. El ejemplo de javu61 también es muy bueno y sencillo, me ha gustado bastante.


El compilador de C que conozco para NGPC si que tiene la librería estándard de C, asi que puedes usar string.h sin problemas.

Como te dicen aqui, con incluir la cabecera con #include <string.h> al principio del archivo, y usando las funciones de la misma, no tendrias problemas,
un ejemplo:
http://www.cplusplus.com/reference/cstring/strcat/

Como bien dice, tienes que tener en cuenta que estás usando C, no C#, las strings no son dinámicas, son arrays de char, que en C tienen una longitud definida al crearse (o al reservar memoria para ellos), por lo que la cadena destino, tiene que tener tamaño suficiente para albergar la concatenación de las dos cadenas.

En el enlace que te he puesto, tienes el resto de la librería de C (a la izquierda, "Reference: C library") con buenos ejemplos.

Puedes ir probando en tu ordenador (con un compilador de C, puedes bajarte por ejemplo el IDE Code::Blocks), y probar compilando cosas para PC antes de hacerlo directamente en NGPC que será mucho más dificil hacer debug cuando estás aprendiendo lo básico.

Ya nos cuentas.

Creo que si, estás en lo cierto, si no me equivoco algunas librerias ya están incluidas en el compilador de la NGPC existente (creo que es el único). Voy a probar todo a ver que tal, aunque si, intentar unir cadenas de texto en este lenguaje se me hace super comlpicado mentalmente por la costumbre que tengo a realizar cadena = 'hola' & 'mundo' jejjejejeje.

Lo que si me cuesta entender por concepto, es lo de los punteros. ¿Cuál es el fin real de un puntero? ¿Gestionar la memoria a mi gusto no? Me cuesta entenderlo aún así ¿Alguien me puede dar un ejemplo práctico?
Gracias a todos. CUalquier cosa vuelvo a postear por aquí.

Gracias.

GameMaster
24/11/2012, 22:32
Un puntero apunta a una variable/region de memoria, y no necesitas crear mas variables si sólo quieres reutilizar algo que ya esta definido sin necesidad de crealo de nuevo

^MiSaTo^
25/11/2012, 00:43
Vaya no esperaba unas respuestas tan claras, la verdad es que me habeis resuelto varias dudas que tenía incluso algunas extras. Mi "mala" costumbre es la de trabajar bajo POO, ya que nunca he trabajado con lenguajes a bajo nivel.

Actualmente voy desarrollando cosillas poco a poco para la pocket y la verdad es que gestionar cualquier cosilla se hace un poco tediosa y me resulta una programación más lineal que la OPP, pero es lo que hay jejejeje.

Gracias por las aclaraciones con el tema de string.h, lo tenía entendido como una clase aunque bien explicado como comenta juanvc está mucho más claro. El ejemplo de javu61 también es muy bueno y sencillo, me ha gustado bastante.



Creo que si, estás en lo cierto, si no me equivoco algunas librerias ya están incluidas en el compilador de la NGPC existente (creo que es el único). Voy a probar todo a ver que tal, aunque si, intentar unir cadenas de texto en este lenguaje se me hace super comlpicado mentalmente por la costumbre que tengo a realizar cadena = 'hola' & 'mundo' jejjejejeje.

Lo que si me cuesta entender por concepto, es lo de los punteros. ¿Cuál es el fin real de un puntero? ¿Gestionar la memoria a mi gusto no? Me cuesta entenderlo aún así ¿Alguien me puede dar un ejemplo práctico?
Gracias a todos. CUalquier cosa vuelvo a postear por aquí.

Gracias.

Jejej esque ya no es sólo que sea más bajo nivel, sino que es otro paradigma: programación estructurada ;)

Como ejemplo de puntero.. veamos. Un puntero sólo es una "variable" que almacena una dirección de memoria de otra. Imagínate que vas a pasar un array muy tocho a una función y que por cada vez que lo pases se crea una copia. Pues eso acabaría petando la memoria (entre otros problemas que podrían surgir que no vienen al caso) Sin embargo, si a esa función le pasas directamente la dirección de memoria donde está ese array, podrías llamarla tantas veces como quieras sin el riesgo de que pete.

Es un concepto que a mi me costó pillar, pero que una vez entendido y a base de usarlo es muy útil.
También si estás acostumbrado a C#, estarás acostumbrado al garbage collector. Aquí cada vez que reserves memoria por ejemplo con malloc, tienes después que liberarla con free. Eso a rajatabla.

GameMaster
25/11/2012, 07:40
Como vienes de C# mira los punteros en funciones como los valores que pasas por referencia (ref int myvalor1 por ejemplo, o out int myvalor1) a funciones y que se usan para recuperar varios valores devueltos por una funcion.

Haohmaru
27/11/2012, 12:16
Bueno ya he resuelto el problemilla que tenía y me estoy acostumbrando a usar punteros, me ha gustado mucho la explicación de ^Misato^

Gracias a todos ;)

EDITADO: ¿Alguien sabría decirme como puedo obtener la librería de funciones básicas de C? Como por ejemplo la string.h Mi compilador no las contiene y no se como puedo obtenerlas para trabajar con ellas, ya que incluirlas no me da error, pero si usar sus métodos ya que el compilador me dice que el método, por ejemplo strcpy no se encuentra.

Jurk
27/11/2012, 16:18
Bueno ya he resuelto el problemilla que tenía y me estoy acostumbrando a usar punteros, me ha gustado mucho la explicación de ^Misato^

Gracias a todos ;)

EDITADO: ¿Alguien sabría decirme como puedo obtener la librería de funciones básicas de C? Como por ejemplo la string.h Mi compilador no las contiene y no se como puedo obtenerlas para trabajar con ellas, ya que incluirlas no me da error, pero si usar sus métodos ya que el compilador me dice que el método, por ejemplo strcpy no se encuentra.

No son metodos, son FUNCIONES!
Ay ay ay, todavia seguimos con el cacao mental de la POO... XD

por si acaso prueba a incluir <cstring> o <string.h>

Y si no, aqui tienes la cabecera de string.h (http://www.nongnu.org/avr-libc/user-manual/string_8h_source.html)

solo te falta buscar los archivos de definicion necesarios (extern)

Haohmaru
27/11/2012, 16:29
No son metodos, son FUNCIONES!
Ay ay ay, todavia seguimos con el cacao mental de la POO... XD

por si acaso prueba a incluir <cstring> o <string.h>

Y si no, aqui tienes la cabecera de string.h (http://www.nongnu.org/avr-libc/user-manual/string_8h_source.html)

solo te falta buscar los archivos de definicion necesarios (extern)

Perdón perdón, me lio bastante jejeje. Cierto son funciones y no métodos.

Gracias por pasarme el fichero de cabecera. La verdad es que no tengo ni idea de donde buscar los extern, miraré a ver por la red.

Gracias ;)

xzakox
27/11/2012, 20:13
Que SDK de NGPC estás usando?

hardyx
27/11/2012, 20:50
Hombre, cualquier SDK de C tiene que incluir la string.h, ya que es básica.
Sin eso es casi como programar en ensamblador de alto nivel. :D

Haohmaru
28/11/2012, 09:17
Que SDK de NGPC estás usando?

Pues el único que he encontrado a estas alturas de la película, el framework 4 que está publicado en un página de desarrollo de la pocket en yahoo. Me acabo de dar cuenta que el compilador, en sus directorios dispone de las librerias de C, entre ellas la string.h, pero cuando la uso en el compilador no funciona...


/* Copyright(C) 1994 TOSHIBA CORPORATION All rights reserved */
/* $RCSfile: STRING.H $ */
/* $Revision: 1.2 $ */
/* $Date: 1996/02/27 14:16:39 $ */

Los ficheros extern también existen, pero no compila...me dice:



Unresolved external symbol "_strcpy"
Reference made to unresolved external symbol "_strcpy"


Y yo lo que he hecho es lo siguiente:


#if 1 // header files

#include "ngpc.h" // required
#include "carthdr.h" // required
#include "library.h" // NGPC routines
#include "tl_logo.inc"
#include <string.h>
#endif

void main(void)
{
char tex1[5] = "01234";
char tex2[5] = "56789";

strcpy(tex1, tex2);

InitNGPC();

while(1)
{

}
}

¿Funcionaría si cojo los ficheros de la clase string y los incorporo al directorio de mi proyecto?

GameMaster
28/11/2012, 09:24
pasanos el link del sdk please

^MiSaTo^
28/11/2012, 09:28
Puedes poner cómo estás compilando? Porque me da la impresión de que no estás linkando bien o lo mismo no tienes bien declarados los path al SDK o algo así

Jurk
28/11/2012, 09:35
Mata moscas a cañonazos:Coge todos los h, todos los.o y todos los dll, ponlos en la carpeta de tu proyecto y los includes los haces con comillas en vez de conAla, ahora matadme...

^MiSaTo^
28/11/2012, 09:52
Ahora que miro... por qué tienes esto:


#if 1 // header files

#include "ngpc.h" // required
#include "carthdr.h" // required
#include "library.h" // NGPC routines
#include "tl_logo.inc"
#include <string.h>
#endif

con un #if 1?

Los includes son como los imports en C# (creo que eran imports, ains ya no lo se porque en los últimos 2-3 meses he estado con C#, Java, Obj-C y PHP y la verdad que ya los mezclo xD). No se para qué necesitas un define ahí

GameMaster
28/11/2012, 09:53
son 'using' no imports

^MiSaTo^
28/11/2012, 09:54
son 'using' no imports

pal caso using que imports, como digo he estado con 4 lenguajes a la vez y ahora estoy sólo con Obj-C, no me pidas más XD

Haohmaru
28/11/2012, 09:57
Bueno antes de nada gracias por vuestra ayuda.

Os dejo el framework: descargar (https://dl.dropbox.com/u/3877624/ngpcbins.rar)

Y os comento como compilo el asunto.

El código es el que mostré antes:


#if 1 // header files

#include "ngpc.h" // required
#include "carthdr.h" // required
#include "library.h" // NGPC routines
#include "tl_logo.inc"
#include <string.h>
#endif

void main(void)
{
char tex1[5] = "01234";
char tex2[5] = "56789";

strcpy(tex1, tex2);

InitNGPC();

while(1)
{

}
}


Ahora, para compilar hago lo siguiente:
1) Descomprimido el framework en el directorio C: (c:\ngpcbins), lanzo la consola de comandos:
2) Ejecuto lo siguiente: c:\ngpcbins env.bat. Este fichero introduce por lo que entiendo, el directorio del compilador en las variables de entorno:


C:\NGPC\ngpcbins>path=C:\ngpcbins\T900\bins
C:\NGPC\ngpcbins>SET THOME=C:\ngpcbins\T900


3) establecidas ya las variables de entorno, me voy al directorio del juego, y hago el make.


C:\DEV\JUEGO make


Eso es todo lo que hago. De momento siempre me ha compilado correctamente y me crea la rom de neo geo pocket, es más, puedo lanzarla en el emulador y funciona, pero si incluyo el string.h y utilizo la función strcpy(); me da el error que estaba mostrando. Quizás estoy haciendo algo mal.

¿Qué os parece?

^MiSaTo^
28/11/2012, 10:00
Bueno antes de nada gracias por vuestra ayuda.

Os dejo el framework: descargar (https://dl.dropbox.com/u/3877624/ngpcbins.rar)

Y os comento como compilo el asunto.

El código es el que mostré antes:


#if 1 // header files

#include "ngpc.h" // required
#include "carthdr.h" // required
#include "library.h" // NGPC routines
#include "tl_logo.inc"
#include <string.h>
#endif

void main(void)
{
char tex1[5] = "01234";
char tex2[5] = "56789";

strcpy(tex1, tex2);

InitNGPC();

while(1)
{

}
}


Ahora, para compilar hago lo siguiente:
1) Descomprimido el framework en el directorio C: (c:\ngpcbins), lanzo la consola de comandos:
2) Ejecuto lo siguiente: c:\ngpcbins env.bat. Este fichero introduce por lo que entiendo, el directorio del compilador en las variables de entorno:


C:\NGPC\ngpcbins>path=C:\ngpcbins\T900\bins
C:\NGPC\ngpcbins>SET THOME=C:\ngpcbins\T900


3) establecidas ya las variables de entorno, me voy al directorio del juego, y hago el make.


C:\DEV\JUEGO make


Eso es todo lo que hago. De momento siempre me ha compilado correctamente y me crea la rom de neo geo pocket, es más, puedo lanzarla en el emulador y funciona, pero si incluyo el string.h y utilizo la función strcpy(); me da el error que estaba mostrando. Quizás estoy haciendo algo mal.

¿Qué os parece?
Varias cosas:
Cuidadito con la variable Path, que veo que la asigna a esto: path=C:\ngpcbins\T900\bins
Y el resto de tu path? No sea que se lo esté cargando! Supongo que debería hacer PATH = %PATH%;C:\ngpcbins\T900\bins (perdonad si hay algún error, no uso windows)
Por otro lado, puedes pegar lo que hace el make exactamente? Porque puede ser que al linkar no esté apuntando a donde tengas las libs y headers. Ahí yo solo veo que asignas la ruta de los binarios ;)

swapd0
28/11/2012, 10:15
El error de que no encuentra el _strcpy es porque al "linkar" no le has añadido la libreria de c.

juanvvc
28/11/2012, 10:17
si ejecutas make, tendras un archivo makefile en tu directorio. Ponlo tambien por aqui.

Si cuando llegue al despacho aun no te han exolicado por qué en C secompula en dos pasos y qué es linkar (que creo que eslo qe te.esta fallando), ya te lo explico yo.

^MiSaTo^
28/11/2012, 10:19
si ejecutas make, tendras un archivo makefile en tu directorio. Ponlo tambien por aqui.

Si cuando llegue al despacho aun no te han exolicado por qué en C secompula en dos pasos y qué es linkar (que creo que eslo qe te.esta fallando), ya te lo explico yo.

Sí, seguramente no esté linkando bien, como ha dicho tb swapd0 (y yo más arriba :P).

Haohmaru
28/11/2012, 10:27
si ejecutas make, tendras un archivo makefile en tu directorio. Ponlo tambien por aqui.

Si cuando llegue al despacho aun no te han exolicado por qué en C secompula en dos pasos y qué es linkar (que creo que eslo qe te.esta fallando), ya te lo explico yo.

Eso no estaría de más si no te molesta juanvvc ^^ Necesito saberlo, para poder trabajar al 100%


Vale puede ser lo que comentais. Realmente desconozco o desconocía que tenga que incluir algo más en el makefile. Mi make file tiene lo siguiente:

Esto es el fichero de entorno, su contenido


path=%path%;C:\ngpcbins\T900\bin
SET THOME=C:\ngpcbins\T900




.SUFFIXES: .c .asm .rel .abs
NAME = NOMBREJUEGO
OBJS = \
NOMBREJUEGO.rel \
library.rel \


$(NAME).ngp: makefile ngpc.lcf $(OBJS)
tulink -la -o $(NAME).abs ngpc.lcf system.lib $(OBJS)
tuconv -Fs24 $(NAME).abs
s242ngp $(NAME).s24

.c.rel:
cc900 -c -O3 $< -o $@

clean:
del *.rel
del *.abs
del *.map
del *.s24



¿Que os parece, tendría que indicar el la lista de OBJS algo más?

hardyx
28/11/2012, 10:34
En el makefile tienes que tener una opción de linkado como la siguiente "-lc", que incluye la libreria "libc.so" que es la librería de C que contiene la implementación de las funciones de string.h y otros ficheros estándar.

Ese fichero ngpc.lcf parece un fichero adicional de linkado, podrías mirarlo a ver si llama a alguna librería.


Eso no estaría de más si no te molesta juanvvc ^^ Necesito saberlo, para poder trabajar al 100%

Para ahorrar trabajo a juanvvc, aqui lo tienes explicado.
http://www.josedomingo.org/web/mod/resource/view.php?id=1691

^MiSaTo^
28/11/2012, 10:41
Como te dice hardyx deberías tener una opción de linkado -lc donde pone tulink -la -o blablabla pues pon ahí después del -la -lc.
Incluso lo del bat tb se podría poner en el makefile (son super útiles los makefiles una vez los entiendes).

Te dejo un enlace sobre el proceso de compilado de GCC, donde explica los 4 pasos que sigue el compilador y linker y demás que seguro que te lo explica mejor que yo: http://codingfreak.blogspot.nl/2008/02/compilation-process-in-gcc.html

juanvvc
28/11/2012, 11:34
Sí, seguramente no esté linkando bien, como ha dicho tb swapd0 (y yo más arriba :P).

Sí, lo había visto, pero no le habíais explicado al pobre qué es linkar y cómo podía solucionar su error :D

Haohmaru, como ya explican en los enlaces que te han pasado, "compilar tu programa" es solo el primer paso. Durante el compilado, cada uno de tus archivos de tu programa se transforma por separado al código de la máquina. Pero 1.- si tienes varios archivos, estos aún no estarán enlazados entre sí 2.- las librerías externas que puedas usar tampoco estarán enlazadas con tu programa. Ése es el segundo paso: linkar, es decir, enlazar entre sí todos los archivos que puedas tener y las librerías externas que utilices.

Así que como ya te avisan por arriba y voy a repetir para que MiSaTo me vuelva a regañar, te falta una opción -lc en el linkador para que linke también la librería c estándar, es decir, la libc. Ojo: la librería se suele llamar libc y por eso se linka con -lc (el -l es para decir "linka" y el c es el nombre de la librería, sin el lib) Pero por lo que veo en el Makefile los nombres no parecen muy estándar, así que puede ser que la libc no se llame libc...

^MiSaTo^
28/11/2012, 11:36
Sí, lo había visto, pero no le habíais explicado al pobre qué es linkar y cómo podía solucionar su error :D

Haohmaru, como ya explican en los enlaces que te han pasado, "compilar tu programa" es solo el primer paso. Durante el compilado, cada uno de tus archivos de tu programa se transforma por separado al código de la máquina. Pero 1.- si tienes varios archivos, estos aún no estarán enlazados entre sí 2.- las librerías externas que puedas usar tampoco estarán enlazadas con tu programa. Ése es el segundo paso: linkar, es decir, enlazar entre sí todos los archivos que puedas tener y las librerías externas que utilices.

Así que como ya te avisan por arriba y voy a repetir para que MiSaTo me vuelva a regañar, te falta una opción -lc en el linkador para que linke también la librería c estándar, es decir, la libc. Ojo: la librería se suele llamar libc y por eso se linka con -lc (el -l es para decir "linka" y el c es el nombre de la librería, sin el lib) Pero por lo que veo en el Makefile los nombres no parecen muy estándar, así que puede ser que la libc no se llame libc...

No, no era regañado! Era estar de acuerdo contigo :)

Haohmaru
28/11/2012, 11:45
Sí, lo había visto, pero no le habíais explicado al pobre qué es linkar y cómo podía solucionar su error :D

Haohmaru, como ya explican en los enlaces que te han pasado, "compilar tu programa" es solo el primer paso. Durante el compilado, cada uno de tus archivos de tu programa se transforma por separado al código de la máquina. Pero 1.- si tienes varios archivos, estos aún no estarán enlazados entre sí 2.- las librerías externas que puedas usar tampoco estarán enlazadas con tu programa. Ése es el segundo paso: linkar, es decir, enlazar entre sí todos los archivos que puedas tener y las librerías externas que utilices.

Así que como ya te avisan por arriba y voy a repetir para que MiSaTo me vuelva a regañar, te falta una opción -lc en el linkador para que linke también la librería c estándar, es decir, la libc. Ojo: la librería se suele llamar libc y por eso se linka con -lc (el -l es para decir "linka" y el c es el nombre de la librería, sin el lib) Pero por lo que veo en el Makefile los nombres no parecen muy estándar, así que puede ser que la libc no se llame libc...

Pues va a ser que no se llama libc porque al añadir la linea me da error..



tulink -la -lc -o $(NAME).abs ngpc.lcf system.lib $(OBJS)


El ERROr que me da es: TULINK-Fatal-106: Illegal sub option in '-l'

Voy a tener que leer mucha documentación porque entiendo lo que quereis decirme, pero ya me pierdo con los ficheros :(

juanvvc
28/11/2012, 12:07
El problema que tienes es que ese SDK parece terriblemente poco estándar, así que solo podrá ayudarte alguien que conozca ese SDK en particular. Que a estas alturas, será muy poca gente.

Yo "controlo" las opciones del las herramientas compatibles con gnu, pero tengo poca idea de las opciones que manejarán otros compiladores y linkadores.

Haohmaru
28/11/2012, 12:25
Pues me parece entonces que me voy a quedar con las ganas jejjejeje

Gracias igualmente por las molestias.

Editado:

Ahora si que me doy cabezasos en la mesa...
Resulta que si me declaro en código una función llamada strcpy() como la que utiliza la librería string.h el compilador me dice:
Redeclaration of 'strcpy'...ok entiendo que el compilador detecta que la librería está y encuentra la función, pero si la voy a usar así:



char *p = "Hello, world!";
char a[14];
strcpy(a, p);


Al compilar me dice lo siguiente:


TULINK-Warning-511: Unresolved external symbol "_strcpy"
TULINK-Error-209: Reference made to unresolved external symbol "_strcpy"


Chúpate esa!..Esto está fatality...

Haohmaru
03/12/2012, 09:28
Ya he resuelto el asunto. Al final si que he podido utilizar la librería string.h y otras. Solo tenía que incluir en el tulink el fichero C900ML.LIB, y ya compila todo y funciona perfectamente:


tulink -la -o $(NAME).abs ngpc.lcf system.lib C900ML.LIB $(OBJS)

Sigo a la carga con mi proyecto ;)