Использование динамической библиотеки Load возвращает другой результат - PullRequest
0 голосов
/ 08 октября 2018

У меня проблема с использованием DLL, у меня есть код, который шифрует строки, buf с использованием dll, результат изменения функции.

CODE:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



int cantidad(char *s){
    int max=0;
    for (int i = 0; s[i] ; i++) {
        max=i;
    }
    return max+1;
}

char* pascal(char *s) {
    //char s1[cantidad(s)];
    int cuociente;
    char *s1=calloc(strlen(s)+1,sizeof(char));
    strcpy(s1,s);
    if (s == NULL){ //caso que sea nulo.
        return NULL;
    }
    cuociente=cantidad(s)/2;
    if(cantidad(s)%2==0){//par
        for (int i = 0; i <cuociente-1 ; i++) {
            if(i%2==0){ // iteracion impar debido a que esta parte siendo iteracion 1,
                s[cuociente-2-i]=s1[cantidad(s)-1-i];
                s[cuociente+1+i]=s1[i];
            }
            if(i%2!=0){// iteracion par
                s[cuociente-2-i]=s1[i];
                s[cuociente+1+i]=s1[cantidad(s)-1-i];

            }

        }

    }

    if(cantidad(s)%2!=0){//impar
        for (int k = 0; k <cuociente-1 ; k++) {
            if (k%2==0){ //iteracion impar
                s[cuociente-2-k]=s1[cantidad(s)-1-k];
                s[cuociente+2+k]=s1[k];
            }
            if (k%2!=0){ //iteracion par
                s[cuociente-2-k]=s1[k];
                s[cuociente+2+k]=s1[cantidad(s)-1-k];
            }
        }
    }
    printf("%s",s);
    return s;

}

Использование CLion и терминала,если я зашифровываю "btvenyz tnyvn", функция возвращает "teytnyz bvvnn", что является ожидаемым результатом.Но если я использую makefile и DLL:

MAKEFILE:

all: shared compile

shared:
    gcc -c -Wall -Werror -fpic ./lib/pascal.c
    mkdir ./sym
    gcc -shared -o ./sym/libpascal.so pascal.o

compile:
    mkdir ./bin
    gcc -Wall -Werror main.c -o ./bin/hash -ldl
    rm -r *.o

clean:
    rm -r ./sym ./bin

MAIN WITH DLL:

int main(){
    char palabra[256],seq[256];
    char (*func_pascal)(char[]);
    void *handle_pascal;
    char *error;
    //PREPARE LIBRARY
    handle_pascal= dlopen("../sym/libpascal.so",RTLD_LAZY);

    // ERROR
    if(!handle_pascal){
        fprintf(stderr, "%s \n", dlerror());
        exit(EXIT_FAILURE);
    }
    dlerror();

    func_pascal = (char (*)(char[])) dlsym(handle_pascal,"pascal");

    error = dlerror();
    //ERROR
    if(error != NULL){
        fprintf(stderr,"%s \n", error);
        exit(EXIT_FAILURE);
    }
//INPUT
    fgets(palabra,256,stdin);
    fgets(seq,256,stdin);
    printf("STRING: %s\n",palabra);
    for (int i = 0; seq[i]; ++i)
    {
        if (seq[i]=='P')
        {
            (*func_pascal)(palabra);
            printf("ENCRYPTED WORD:%s\n",palabra);
        }
    }


    return 0;
}

Используя DLL, вы получите:

INPUT

btvenyz tnyvn
P 

OUTPUT

STRING: btvenyz tnyvn

ynevt
z bnvyntENCRYPTED WORD:ynevt
z bnvynt

Первоначально существует несколько кодов шифрования, где только этот генерирует ошибку в выводе, поэтому я хотел бы знать, что я делаю неправильно и какчтобы решить ее, большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...