Thread: What am I overlooking with my library?

  1. #1
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,249

    What am I overlooking with my library?

    The output issue:
    Code:
    make --no-print-directory CLONED_DIR=.. rebuild
    cd ../ && make rebuild
    make -f run.mak rebuild
    git -C ../mak pull
    Already up to date.
    rm -f ./bin/*.exe
    rm -f ./lib/*.dll
    rm -f ./src/*.obj
    rm -f ./bin/*.out
    rm -f ./lib/*.so
    rm -f ./src/*.o
    gcc -I ./include -L ./lib  -D PAW_EXPORT -o src/app.c.o -c src/app.c
    gcc -I ./include -L ./lib  -D PAW_EXPORT -o src/apps.c.o -c src/apps.c
    gcc -I ./include -L ./lib  -D PAW_EXPORT -o src/lib.c.o -c src/lib.c
    gcc -I ./include -L ./lib  -D PAW_EXPORT -o src/libs.c.o -c src/libs.c
    gcc -I ./include -L ./lib  -D PAW_EXPORT -o src/maps.c.o -c src/maps.c
    gcc -I ./include -L ./lib  -D PAW_EXPORT -o src/paw.c.o -c src/paw.c
    gcc -I ./include -L ./lib  -D PAW_EXPORT -o src/shared.c.o -c src/shared.c
    gcc -I ./include -L ./lib  -o ./lib/libpaw.so src/app.c.o src/apps.c.o src/lib.c.o src/libs.c.o src/maps.c.o src/paw.c.o src/shared.c.o -ldl
    gcc -I ./include -L ./lib  -o chkpaw.out ./src/chkpaw.c -lpaw -ldl
    /usr/bin/ld: /tmp/ccmy0FBq.o: in function `test':
    chkpaw.c:(.text+0x21): undefined reference to `paw_load_app'
    /usr/bin/ld: chkpaw.c:(.text+0x5d): undefined reference to `paw_unload_app'
    collect2: error: ld returned 1 exit status
    make[2]: *** [run.mak:38: chkpaw.out] Error 1
    make[1]: *** [GNUmakefile:9: rebuild] Error 2
    make: *** [makefile:4: rebuild] Error 2
    Compilation failed.
    The relevant source code:
    Code:
    #ifdef _MSC_VER
    #	define PAW__EXPORT __declspec(dllexport)
    #	define PAW__IMPORT __declspec(dllimport)
    #	define PAW_HIDDEN
    #elif defined( __GNUC__ ) && __GNUC__ > 4
    #	define PAW__EXPORT __attribute__((visibility("default")))
    #	define PAW__IMPORT
    #	define PAW_HIDDEN __attribute__((visibility("hidden")))
    #else
    #	define PAW__EXPORT
    #	define PAW__IMPORT
    #	define PAW_HIDDEN
    #endif
    
    #ifdef PAW_EXPORT
    #	define PAW_PUBLIC PAW__EXPORT
    #elif defined( PAW_STATIC )
    #	define PAW_PUBLIC
    #else
    #	define PAW_PUBLIC PAW__IMPORT
    #endif

  2. #2
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    38,618
    > /usr/bin/ld: chkpaw.c.text+0x5d): undefined reference to `paw_unload_app'
    This usually means
    - you didn't implement that function.
    - you implemented it, but it's static (or hidden) for some reason.
    - you mis-spelled the name between the declaration and the use.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

  3. #3
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,249
    - you implemented it, but it's static (or hidden) for some reason
    is all it can be
    Code:
    #if defined( PAW_BUILD_SHARED ) && defined( PAW_WIN32 )
    #	define PAW_SHARED PAW_EXPORT
    #else
    #	define PAW_SHARED
    #endif
    ...
    PAW_SHARED struct paw_app* paw_load_app( void *ud, int pid )
    {
    	struct paw_app *app = paw__record_app(ud);
    	struct paw_text *path;
    	
    	if ( !app )
    		return NULL;
    		
    	app->pid = pid;
    	
    	if ( pid == getpid() )
    		strcpy( app->proc, "/proc/self" );
    	else
    		sprintf( app->proc, "/proc/%i", pid );
    	
    	path = &(app->path);
    	path->buff = paw.alloc( ud, NULL, 0, PAW_APP_PATH_DEFAULT_SIZE );
    	
    	if ( !path->buff )
    	{
    		paw_unload_app( ud, app );
    		return NULL;
    	}
    	
    	path->size = PAW_APP_PATH_DEFAULT_SIZE;
    
    	return app;
    }
    PAW_HIDDEN void paw__forget_app( void *ud, struct paw_app *app )
    {
    	struct paw_text *text = &(app->buff);
    	
    	paw_unhook_app( ud, app );
    	
    	if ( text->buff )
    		(void)paw.alloc( ud, text->buff, text->size, 0 );
    		
    	text = &(app->path);
    	
    	if ( text->buff )
    		(void)paw.alloc( ud, text->buff, text->size, 0 );
    	
    	text = &(app->bootpath);
    	
    	if ( text->buff )
    		(void)paw.alloc( ud, text->buff, text->size, 0 );
    }
    
    PAW_SHARED void paw_unload_app( void *ud, struct paw_app *app )
    {
    	paw__forget_app( ud, app );
    	(void)paw.alloc( ud, app, sizeof( struct paw_app ), 0 );
    }
    Edit: btw I changed the define that checking for from PAW_EXPORT to PAW_BUILD_SHARED and renamed the PAW__EXPORT/PAW__IMPORT to PAW_EXPORT/PAW_IMPORT

  4. #4
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    38,618
    So how does that differ from all the other public functions in your other source files?

    Does 'nm ./lib/libpaw.so' tell you anything about what symbols are present?
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

  5. #5
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,249
    nm libpaw.so gave me this:
    Code:
    000000000000039c r __abi_tag
    00000000000050d0 B __bss_start
                     U close@GLIBC_2.2.5
    00000000000050d0 b completed.0
                     w __cxa_finalize@GLIBC_2.2.5
    00000000000050c0 D __data_start
    00000000000050c0 W data_start
    00000000000011b0 t deregister_tm_clones
                     U dlopen@GLIBC_2.2.5
    0000000000001220 t __do_global_dtors_aux
    0000000000004de0 d __do_global_dtors_aux_fini_array_entry
    00000000000050c8 D __dso_handle
    0000000000004de8 d _DYNAMIC
    00000000000050d0 D _edata
    00000000000050e0 B _end
                     U __errno_location@GLIBC_2.2.5
                     U fclose@GLIBC_2.2.5
    0000000000002368 T _fini
                     U fopen@GLIBC_2.2.5
    0000000000001270 t frame_dummy
    0000000000004dd0 d __frame_dummy_init_array_entry
    000000000000350c r __FRAME_END__
                     U fread@GLIBC_2.2.5
                     U free@GLIBC_2.2.5
                     U fseek@GLIBC_2.2.5
                     U fseeko64@GLIBC_2.2.5
                     U fwrite@GLIBC_2.2.5
                     U getpid@GLIBC_2.2.5
    0000000000005000 d _GLOBAL_OFFSET_TABLE_
                     w __gmon_start__
    000000000000306c r __GNU_EH_FRAME_HDR
    0000000000001000 t _init
    00000000000022d3 t init
    0000000000004de0 d __init_array_end
    0000000000004dd0 d __init_array_start
    0000000000003000 R _IO_stdin_used
                     U __isoc99_sscanf@GLIBC_2.7
                     w _ITM_deregisterTMCloneTable
                     w _ITM_registerTMCloneTable
    0000000000002360 T __libc_csu_fini
    00000000000022f0 T __libc_csu_init
                     U __libc_start_main@GLIBC_2.2.5
    00000000000022da T main
                     U malloc@GLIBC_2.2.5
                     U memcpy@GLIBC_2.14
                     U memset@GLIBC_2.2.5
                     U open@GLIBC_2.2.5
    00000000000050d8 B paw
    00000000000016ab T paw_1st_app
    0000000000001da1 T paw__alloc
    0000000000001619 T paw_boot_app
    0000000000001877 T paw_compare_maps
    0000000000001e74 T paw_dump_app_state
    00000000000012bd T paw__forget_app
    00000000000022be T paw_get_app_boot_bath
    00000000000016d1 T paw_have_lib
    0000000000001417 T paw_hook_app
    0000000000001e14 T paw_init
    0000000000001675 T paw_list_apps
    0000000000001527 T paw_load_app
    00000000000016f4 T paw_load_lib
    0000000000001717 T paw_load_maps_file
    00000000000019ec T paw_load_maps_text
    00000000000016be T paw_nxt_app
    0000000000001e5f T paw__perm2native
    0000000000001279 T paw__record_app
    0000000000001e58 T paw_term
    00000000000013e5 T paw_unhook_app
    000000000000162c T paw_unlist_apps
    00000000000013a0 T paw_unload_app
                     U qsort@GLIBC_2.2.5
                     U realloc@GLIBC_2.2.5
    00000000000011e0 t register_tm_clones
                     U sprintf@GLIBC_2.2.5
                     U __stack_chk_fail@GLIBC_2.4
    0000000000001180 T _start
                     U strlen@GLIBC_2.2.5
    00000000000050d0 D __TMC_END__
    What am I looking for? 1st time I hear of nm

  6. #6
    Registered User
    Join Date
    May 2009
    Posts
    4,005
    This code is likely wrong.

    Code:
    #ifdef PAW_EXPORT
    #   define PAW_PUBLIC PAW__EXPORT
    #elif defined( PAW_STATIC )
    #   define PAW_PUBLIC
    #else
    #   define PAW_PUBLIC PAW__IMPORT
    #endif
    Likely more correct is

    Code:
    #if defined( PAW_STATIC )
    #   define PAW_PUBLIC export
    #elif defined( PAW_EXPORT )
    #   define PAW_PUBLIC PAW__EXPORT
    #else
    #   define PAW_PUBLIC PAW__IMPORT
    #endif
    "...a computer is a stupid machine with the ability to do incredibly smart things, while computer programmers are smart people with the ability to do incredibly stupid things. They are,in short, a perfect match.." Bill Bryson

  7. #7
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,249
    Aside from the "extern" bit that looks like it amounts to the same deal though? I'll try anyways

    Edit: Nope, didn't resolve it, what it looks like now btw:
    Code:
    #ifdef PAW_BUILD_STATIC
    #	define PAW_PUBLIC extern
    #elif defined( PAW_BUILD_SHARED )
    #	define PAW_PUBLIC PAW_EXPORT
    #else
    #	define PAW_PUBLIC PAW_IMPORT
    #endif

  8. #8
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,249
    Found out what I overlooked, the library needed to be linked with -shared option set, the code needed to be compiled with the -fPIC option set

  9. #9
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,249
    Another problem being experienced, tried to actually run the app I was compiling and linking to libpaw (one that checks that libpaw does as expected) and ld or whatever it was couldn't find libpaw, I tried setting -Wl,--rpath=. during compile, tried setting LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) on the same line I execute the binary, still nothing, any ideas?
    Code:
    make --no-print-directory CLONED_DIR=.. run (in directory: .../gitlab/gasp/cloned/paw)
    make -f run.mak run
    git -C ../mak pull
    Already up to date.
    cp ./lib/libpaw.so ./bin/libpaw.so
    LD_LIBRARY_PATH=.: && ./bin/chkpaw.out
    ./bin/chkpaw.out: error while loading shared libraries: libpaw.so: cannot open shared object file: No such file or directory
    make[1]: *** [run.mak:28: run] Error 127
    make: *** [GNUmakefile:9: run] Error 2
    Compilation failed.
    Code:
    make --no-print-directory CLONED_DIR=.. rebuild (in directory: /mnt/MEDIA/HOME/gitlab/gasp/cloned/paw)
    make -f run.mak rebuild
    git -C ../mak pull
    Already up to date.
    rm -f ./bin/*.exe
    rm -f ./lib/*.dll
    rm -f ./src/*.obj
    rm -f ./bin/*.out
    rm -f ./lib/*.so
    rm -f ./src/*.o
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/app.c.o -c src/app.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/apps.c.o -c src/apps.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/lib.c.o -c src/lib.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/libs.c.o -c src/libs.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/maps.c.o -c src/maps.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/paw.c.o -c src/paw.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/shared.c.o -c src/shared.c
    gcc -I ./include -L ./lib  -fPIC -shared -o lib/libpaw.so src/app.c.o src/apps.c.o src/lib.c.o src/libs.c.o src/maps.c.o src/paw.c.o src/shared.c.o -ldl
    gcc -I ./include -L ./lib  -fPIC -o bin/chkpaw.out ./src/chkpaw.c -lpaw -Wl,--rpath=.
    Compilation finished successfully.

  10. #10
    Registered User
    Join Date
    May 2009
    Posts
    4,005
    Quote Originally Posted by awsdert View Post
    Another problem being experienced, tried to actually run the app I was compiling and linking to libpaw (one that checks that libpaw does as expected) and ld or whatever it was couldn't find libpaw, I tried setting -Wl,--rpath=. during compile, tried setting LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) on the same line I execute the binary, still nothing, any ideas?
    Code:
    make --no-print-directory CLONED_DIR=.. run (in directory: .../gitlab/gasp/cloned/paw)
    make -f run.mak run
    git -C ../mak pull
    Already up to date.
    cp ./lib/libpaw.so ./bin/libpaw.so
    LD_LIBRARY_PATH=.: && ./bin/chkpaw.out
    ./bin/chkpaw.out: error while loading shared libraries: libpaw.so: cannot open shared object file: No such file or directory
    make[1]: *** [run.mak:28: run] Error 127
    make: *** [GNUmakefile:9: run] Error 2
    Compilation failed.
    Code:
    make --no-print-directory CLONED_DIR=.. rebuild (in directory: /mnt/MEDIA/HOME/gitlab/gasp/cloned/paw)
    make -f run.mak rebuild
    git -C ../mak pull
    Already up to date.
    rm -f ./bin/*.exe
    rm -f ./lib/*.dll
    rm -f ./src/*.obj
    rm -f ./bin/*.out
    rm -f ./lib/*.so
    rm -f ./src/*.o
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/app.c.o -c src/app.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/apps.c.o -c src/apps.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/lib.c.o -c src/lib.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/libs.c.o -c src/libs.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/maps.c.o -c src/maps.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/paw.c.o -c src/paw.c
    gcc -I ./include -L ./lib  -fPIC -D PAW_BUILD_SHARED -o src/shared.c.o -c src/shared.c
    gcc -I ./include -L ./lib  -fPIC -shared -o lib/libpaw.so src/app.c.o src/apps.c.o src/lib.c.o src/libs.c.o src/maps.c.o src/paw.c.o src/shared.c.o -ldl
    gcc -I ./include -L ./lib  -fPIC -o bin/chkpaw.out ./src/chkpaw.c -lpaw -Wl,--rpath=.
    Compilation finished successfully.
    Why does your post suggest you are both running your code from the "./bin" folder and not running your code from the "./bin" folder?

    Decide which folder is "." when you are running the commands and either do an CD to it or another fix!

    Tim S.
    "...a computer is a stupid machine with the ability to do incredibly smart things, while computer programmers are smart people with the ability to do incredibly stupid things. They are,in short, a perfect match.." Bill Bryson

  11. #11
    Registered User
    Join Date
    May 2009
    Posts
    4,005
    Quote Originally Posted by stahta01 View Post
    Why does your post suggest you are both running your code from the "./bin" folder and not running your code from the "./bin" folder?

    Decide which folder is "." when you are running the commands and either do an CD to it or another fix!

    Tim S.
    In other words, the proper thing to try was likely.
    Code:
    LD_LIBRARY_PATH=./bin:$(LD_LIBRARY_PATH)
    Tim S.
    "...a computer is a stupid machine with the ability to do incredibly smart things, while computer programmers are smart people with the ability to do incredibly stupid things. They are,in short, a perfect match.." Bill Bryson

  12. #12
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,249
    Quote Originally Posted by stahta01 View Post
    Why does your post suggest you are both running your code from the "./bin" folder and not running your code from the "./bin" folder?

    Decide which folder is "." when you are running the commands and either do an CD to it or another fix!

    Tim S.
    There's makefiles in each directory that simply launch a new instance of make in either the directory above or if in the project directory the main *.mak file which holds all the targets, this is to force make to use the correct PWD/CWD for the *.mak files so ./ in all cases means the project root, in the case of paw that happens to be inside .../gasp/cloned/paw because that's where I cloned it as I'm planning to use it in gasp (only recently remember the paw project of mine and decided to move everything related from gasp into it and then make a lpaw library for lua), in the case of gasp ./ means .../gasp, ./bin is always in the project root and if it isn't it is made prior to running the *.mak files ensuring the directories become a dependency for those files to be run correctly

  13. #13
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,249
    Quote Originally Posted by stahta01 View Post
    In other words, the proper thing to try was likely.
    Code:
    LD_LIBRARY_PATH=./bin:$(LD_LIBRARY_PATH)
    Tim S.
    Thank you, I'll give that a try

    Edit: Went with a variant, cd'd into the directory and ran with the prior command I had already tried, got a segmentation fault so gonna see if I can track down where that came from.

    Code:
    make --no-print-directory CLONED_DIR=.. run (in directory: .../gasp/cloned/paw)
    make -f run.mak run
    git -C ../mak pull
    Already up to date.
    cp ./lib/libpaw.so ./bin/libpaw.so
    cd ./bin && LD_LIBRARY_PATH=.: && ./chkpaw.out
    make[1]: *** [run.mak:28: run] Segmentation fault (core dumped)
    make: *** [GNUmakefile:20: run] Error 2
    Compilation failed.
    Edit 2: Btw, do any of you know how to open a terminal window from a makefile (cross platform solution is preferred), I've tried variants of the below but to no avail:
    Code:
    X_TERMINAL:=x-terminal-emulator DISPLAY=$(DISPLAY)--working-directory=$(PWD)
    TERMINAL:=$(if $(filter cmd.exe,$(SHELL)),cmd.exe,$(X_TERMINAL))

  14. #14
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,249
    For anyone wandering the segfault was caused by me forgetting to call paw_init( NULL ) which sets the allocator function pointer, paw_load_app() relied on that function but the pointer started as NULL so it just hit a segfault from the word go

  15. #15
    Registered User awsdert's Avatar
    Join Date
    Jan 2015
    Posts
    1,249
    New problem, same library, might as well post here.
    Hitting a segfault but I'm not seeing what I did wrong, I'm assuming I miss-allocated but I rather than just throw memory at the problem to shut it up I'd rather understand it 1st, here's the relevant code:
    Code:
    PAW_HIDDEN int paw_compare_maps( void const * _one, void const * _two )
    {
    	struct paw_map const *one = _one, *two = _two;
    	int ret = (one->first > two->final) - (two->first > one->final);
    	
    	if ( ret )
    		return ret;
    		
    	ret = (two->first < one->first) - (two->first > one->first);
    	
    	if ( ret )
    		return ret;
    	
    	ret = (two->final < one->final) - (two->final > one->final);
    	
    	if ( ret )
    		return ret;
    		
    	ret = (one->perm[0] == 'r') - (two->perm[0] == 'r');
    	
    	if ( ret )
    		return ret;
    	
    	ret = (one->perm[0] == 'w') - (two->perm[0] == 'w');
    	
    	if ( ret )
    		return ret;
    	
    	return (one->perm[0] == 'x') - (two->perm[0] == 'x');
    }
    
    PAW_SHARED int paw_load_maps_text( void *ud, struct paw_text *text, struct paw_maps *maps )
    {
    	struct paw_text *sources = &(maps->sources);
    	struct paw_map *_maps = maps->buff, *map;
    	size_t want = 0, done = 0;
    	char *line = text->buff, *source, *_sources = sources->buff, *temp;
    	
    	want = (text->size / sizeof(struct paw_map)) * sizeof(struct paw_map);
    	
    	if ( maps->size < want )
    	{
    		_maps = paw.alloc( ud, _maps, maps->size, want );
    		if ( !_maps )
    			return ENOMEM;
    			
    		maps->buff = _maps;
    		maps->size = want;
    	}
    	
    	memset( _maps, 0, want );
    	
    	if ( sources->size < text->size )
    	{
    		_sources = paw.alloc( ud, _sources, sources->size, text->size );
    		
    		if ( !_sources )
    			return ENOMEM;
    		
    		sources->buff = _sources;
    		sources->size = text->size;
    	}
    	
    	sources->used = 0;
    	memset( _sources, 0, sources->size );
    	
    	for ( maps->used = 0; *line; maps->used++ )
    	{
    		map = _maps + maps->used;
    		
    		sscanf
    		(
    			line
    			, "%jx-%jx %s %jx %u:%u %lu%n"
    			, &(map->first)
    			, &(map->final)
    			, map->perm
    			, &(map->faddr)
    			, &(map->major)
    			, &(map->minor)
    			, &(map->inode)
    			, &done
    		);
    		
    		for ( source = line + done; *source == ' '; ++source );
    		for ( line = source; *line && *line != '\n' && *line != '\r'; ++line );
    		
    		temp = _sources + sources->used;
    		map->index = sources->used;
    		map->count = (size_t)(line - source);
    		
    		if ( map->count )
    			(void)memcpy( temp, source, map->count );
    		
    		sources->used += map->count + 1;
    	}
    	
    	/* Downsize now we no longer need the optimization */
    	sources->buff = paw.alloc( ud, _sources, sources->size, sources->used );
    	sources->size = sources->used;
    	
    	/* Same with mappings */
    	want = maps->used * sizeof(struct paw_map);
    	maps->buff = paw.alloc( ud, _maps, maps->size, want );
    	maps->size = want;
    	
    	qsort( maps->buff, maps->size, sizeof(struct paw_map), paw_compare_maps );
    	
    	return 0;
    }
    The text parameter only has the 3 members you can see so skip that question, it's preloaded by another function with the contents of /proc/<PID>/maps, in this case it's actually /proc/self/maps (The function that loads app details just fills in the directory to use as an optimization)
    According to gede the segfault occured in paw_compare_apps() but only after successfully comparing a number of them so the error is surely with what I hand qsort(), I gave the rest of paw_load_maps_text() for context, the main area I'm looking at is at the bottom of that function

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Overlooking Something in an Array
    By Feralix in forum C Programming
    Replies: 8
    Last Post: 07-09-2016, 01:37 AM
  2. Replies: 8
    Last Post: 12-10-2014, 03:00 PM
  3. Overlooking something in a comparison
    By csharp100 in forum C Programming
    Replies: 7
    Last Post: 04-29-2012, 09:21 PM
  4. probably something simple I'm overlooking
    By tomasc in forum C++ Programming
    Replies: 3
    Last Post: 05-19-2008, 11:07 PM
  5. Replies: 19
    Last Post: 01-12-2006, 11:04 AM

Tags for this Thread