Создать ответ 
 
Рейтинг темы:
  • Голосов: 0 - Средняя оценка: 0
  • 1
  • 2
  • 3
  • 4
  • 5
вызов функции на С
Автор Сообщение
megavolt85 Не на форуме
Супермодератор
******

Сообщений: 3111
Зарегистрирован: 24.03.2012
Рейтинг: 38
Сказал спасибо: 180
Поблагодарили 1532 раз(а) в 900 сообщ.
Сообщение: #46
RE: вызов функции на С
Что то с тредами у меня не заладилось. Для пробы решил запустить такой код
PHP код:
/* parallelCopy.c */

#include "ds.h"
#include "kos/thread.h"

#define SIZE 4096

typedef struct PART{
    
unsigned long offset;
    
unsigned long size;
}
part_t;

char file[50]; /* source file name */
char fileout[50]; /* target file name */

voidfunc1(void *arg){
    
printf("thread started\n");
    
int finfoutxi;
    
0;
    
part_t *part;
    
char data[SIZE];

    
part = (part_t *)arg;
    if ((
fin fs_open(fileO_RDONLY)) == FILEHND_INVALIDds_printf("Error open file");
    if ((
fout fs_open(fileoutO_WRONLY)) == FILEHND_INVALIDds_printf("Error open file");
    
lseek(finpart->offsetSEEK_SET);
    
lseek(foutpart->offsetSEEK_SET);
        while(
part->size){
                
fs_read(findataSIZE);
                
fs_write(foutdatax);
                
+= x;
        }
        
ds_printf("thread is done.\n");
        
fs_close(fout);
        
fs_close(fin);
        return 
NULL;
}


int main(int argcchar *argv[]){
    
char         data[SIZE];
    
struct stat     f_stat;
    
int         fin1fout1tmpx0;
    
part_t         part1part2part3;
    
kthread_t t1, * t2// two threads to share the load of main thread
    
if (thd_init(THD_MODE_COOP)    != 0ds_printf("Treads alredy initialized.");

    if(
argc 3){
        
ds_printf("Not enough arguments.");
        
ds_printf("parallelCopy sourceFile targetFile");
        return -
1;
    }
    
strcpy(fileargv[1]);
    
stat(file, &f_stat);     // getting the meta info of file
    
strcpy(fileoutargv[2]);

    
ds_printf("Size of file is %lu \n"f_stat.st_size);
    
part1.offset 0;

    
// dividing the size of file in 3 parts
    
part1.size f_stat.st_size 3;
    
part2.offset part1.size;
    
part2.size part1.size;
    
part3.offset part2.offset part2.size;
    
part3.size f_stat.st_size part3.offset;

    
/* creating part1 by main thread */
    
fin1 fs_open(fileO_RDONLY);
    
fout1 fs_open(fileoutO_WRONLY);

    
/*creating 3 threads to copy 2 n 3rd part of file */
    
if ((t1 thd_create(0func1, &part2)) == NULL) { ds_printf("Error create thread 1.");return CMD_ERROR;}
    if ((
t2 thd_create(0func1, &part3)) == NULL) { ds_printf("Error create thread 2.");return CMD_ERROR;}
    while(
part1.size){
        
fs_read(fin1dataSIZE);
        
fs_write(fout1datax);
        
+= x;
    }

if ((
tmp=thd_join(t1NULL)) !=0) { ds_printf("Error join thread 1. code: %d",tmp);return CMD_ERROR;} // making main to wait for t1
if ((tmp=thd_join(t2NULL)) !=0) { ds_printf("Error join thread 2. code: %d",tmp);return CMD_ERROR;} // making main to wait for t2
    
ds_printf("file is copied");
    
fs_close(fout1);
    
fs_close(fin1);
    return 
0;


при сборке получаю ошибку

PHP код:
megavolt@megavolt-GA-790XTA-UD4:~/dreamcast/SDK/examples/commands/parallelCopymake
rm 
-f pcp
/opt/toolchains/dc/sh-elf/bin/sh-elf-gcc --ml -m4-single-only -O2 --Wl,-Ttext=0x00000000 -e _start -nostartfiles -nostdlib -o dbg-pcp parallelCopy.
-L/home/megavolt/dreamcast/kos/lib/dreamcast -L/home/megavolt/dreamcast/kos/addons/lib/dreamcast -L../../../lib -Wl,--start-group  -lds -lkos -lgcc -Wl,--end-group
parallelCopy
.oIn function `main':
/home/megavolt/dreamcast/SDK/examples/commands/parallelCopy/parallelCopy.c:51: undefined reference to 
`_thd_init'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
make: *** [pcp] Ошибка 1 

если в коде убрать if (thd_init(THD_MODE_COOP) != 0) ds_printf("Treads alredy initialized."); , то сборка проходит успешно ,но при запуске в lxdream получаю
PHP код:
D$: pcp /cd/1DS_CORE.BIN /ram/1.bin
Size of file is 1922412
Error join thread 1. code
: -

откуда undefined reference to `_thd_init' ? Какой библиотеки не видит линкер?

HKT-3030, Bios mod, SD mod, VGA internal mod, G1ATA mod, Region changer mod, PSU mod
(Последний раз сообщение было отредактировано 01.03.2014 в 19:18, отредактировал пользователь megavolt85.)
01.03.2014 19:12
Найти все сообщения Цитировать это сообщение
Создать ответ 


Сообщения в этой теме
RE: вызов функции на С - megavolt85 - 01.03.2014 19:12

Переход:


Пользователи просматривают эту тему: 2 Гость(ей)