У меня проблема с использованием 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
Первоначально существует несколько кодов шифрования, где только этот генерирует ошибку в выводе, поэтому я хотел бы знать, что я делаю неправильно и какчтобы решить ее, большое спасибо!