Chirurgia spinală minim invazivă
Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical. Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale. www.neurohope.ro |
Un program care ruleaza ok in Windows dar in aceleasi conditii nu pe Linux
Last Updated: Jun 29 2018 06:30, Started by
ursudepadure
, Jun 25 2018 21:40
·
0
#1
Posted 25 June 2018 - 21:40
Am instalat code::blocks atat pe Windows cat si pe un Debian (Rasbian pe Raspberry PI).
Am verificat pe tot felul de programele mai mici si elementare daca merge pe ambele si a fost ok. Totusi cand am facut un program care imi citeste niste fisiere text si afiseza valorile, merge bine in Windows dar in Linux, desi nu da mesaje de eroare imi citeste aiurea, doar niste valori din primul fisier...Ele sunt numere, dar la acest nivel sunt tratate ca stringuri (mai bine zis siruri de caractere) pana ma hotarasc ce sa fac cu ele. Am sperat ca daca voi compila de la linia de comanda cu g++ ci nu din Code::Blocks va fi mai bine, dar am acelasi rezultat. Ciudat este ca citeste ceva...si nu da nici un mesaj de eroare. Codul pe linux nu a fost modficat deloc. Acesta e codul: #include <iostream> #include <fstream> using namespace std; int main() { // FIECARE DIN ACESTE FISIERE CONTIN 1000 DE RANDURI ifstream intf("time.txt"); ifstream iny1("y1.txt"); ifstream iny2("y2.txt"); ifstream iny3("y3.txt"); ifstream iny4("y4.txt"); // VERIFIC DACA POT FI DESCHISE if(!intf || !iny1 || !iny2 || !iny3 || !iny4 ) { cout << " Unul din fisiere nu poate fi deschis.\n"; return 1; } // IN ACESTE VARIABILE VOR SE VOR CITI VALORILE DIN FISIERE, CE URMEAZA DUPA // NU ARE RELEVANTA AICI char strt[255]; // TIME char stry1[255]; // Y1 char stry2[255]; //Y2 char stry3[255]; //Y3 char stry4[255]; // Y4 // CITESTE FIECARE FISIER LINIE CU LINIE SI PUNE VALOAREA IN VARIABILELE DECLARATE MAI SUS while(intf) { intf.getline(strt, 255); // DELIMITEAZA CA SI CU '\n' iny1.getline(stry1, 255); iny2.getline(stry2, 255); iny3.getline(stry3, 255); iny4.getline(stry4, 255); // AFISEAZA if(intf) cout <<" "<<strt <<" "<<stry1<<" "<<stry2<<" "<<stry3<<" "<<stry4<< endl; } // CLOSE THE STREAMS intf.close(); iny1.close(); iny2.close(); iny3.close(); iny4.close(); return 0; } In windows, cum ma asteptam se creeaza ceva asemanator cu un tabel si toate valorile din fisiere sunt afisate. In linux pare sa citeasca doar cateva valori din prima coloana corect, in rest apar in mod ciudat doar 0.0000000000. Am incercat cu valori mai mici decat 255, ca nu am nevoie de asa mari, dar tot asa face. |
#2
Posted 25 June 2018 - 21:51
Cred ca trebuie sa fie ceva cu carriage return line feed.
Eu asta as verifica prima data. |
#4
Posted 26 June 2018 - 09:20
Fisierele contin 1000 de numere dar initial sunt citite ca siruri de caractere. Fiecare fisier contine cate 1000 de numere de tip double sau float. Le convertesc dupa aceea in numere. Ele corespund unor valori de timp si a unor acceleratii luate de la niste senzori. Dar asta nu conteaza acuma ci faptul ca nu functioneaza bine in Linux desi nu sunt mesaje de eroare.
Fisierele sunt ceva de genul: 0.000000000 0.000169006 0.000259568 0.000350131 etc...1000 de valori fiecare. |
#5
Posted 26 June 2018 - 09:53
Cred ca o sa mearga cu ceva gen:
freopen("time.txt","r",stdin); float f; cin>>f; Asa poate citi valorile direct cu tipul de date de care am nevoie, fara sa mai fac conversia. Sa vad cata precizie are...Inca nu am incercat sa scriu tot programul. |
#6
Posted 26 June 2018 - 10:58
ursudepadure, on 26 iunie 2018 - 09:20, said:
Fisierele contin 1000 de numere dar initial sunt citite ca siruri de caractere. Fiecare fisier contine cate 1000 de numere de tip double sau float. Le convertesc dupa aceea in numere. Ele corespund unor valori de timp si a unor acceleratii luate de la niste senzori. Dar asta nu conteaza acuma ci faptul ca nu functioneaza bine in Linux desi nu sunt mesaje de eroare. Fisierele sunt ceva de genul: 0.000000000 0.000169006 0.000259568 0.000350131 etc...1000 de valori fiecare. Daca fisierul este scris in Windows atunci ai delimitator de linie \r\n. Daca este scris in Linux ai delimitator de linie \n. O solutie rapida la problema ta este sa nu mai citesti valori dupa delimitatorii de linie ci dupa un caracter ales de tine. Sa zicem ca acest "marker " este caracterul @ Iti reconstruiesti fisierul astfel incat sa ai toate numerele pe o singura linie delmitate de @. Pe window, fisierul va arata asa: 0.000000000@0.000169006@0.000259568@...........0.000350131\r\n Pe linux fisierul va arata asa: 0.000000000@0.000169006@0.000259568@...........0.000350131\n Tema de gandire "profunda" :elaboreaza o rutina care incarca dinintr-un fisier date si apoi din buffer elimina caracterele speciale \r si sau \n si iti desparte numerele dupa caracterul @ Rutina trebuie sa returneze un vector unde fiecare element reprezinta stringul delimitat de pozitiile succesive ale caracterului @ 2. Daca fisierul iti este livrat de o aplicatie terta cu fiecare valoare pe cate o linie , de fapt structura reala a fisierului tau este urmatoarea pe Windows: 0.000000000\r\n0.00016900\r\n0.000259568\r\n...........0.000350131 Scrie atunci o subrutina care sa caute \r si daca il gaeste sa-l stearga si ramai cu 0.000000000\n0.00016900\n0.000259568\n...........0.00035013 ( care este structura pe Linux) Apoi buferul il servesti catre o functie care citeste dupa delimitatorul '\n' sau poti sa-ti construiesti tu una(daca vrei) Edited by WinstonMontana, 26 June 2018 - 11:11. |
#7
Posted 26 June 2018 - 13:17
Da, o sa incerc sa fac toate astea in notepad++ ca acolo pot inlocui \r\n cu altceva fara bataie de cap, direct cu "replace".
S-a intamplat sa am nevoie sa adaug chestii de genul \r\n in loc de spatiu sa asez cuvintele dintr-un text unul sub altul. Notepad++ e aur curat la chestii din astea. Nu stiam ca in linux \r\n este doar \n´. Informatie foarte utila, merci fain! Asta era, intradevar. Am folosit "replace" in notepad++ si am inlocuit \r\n cu \n. Acuma merge brici si in Linux. Merci de sfat. |
#8
Posted 26 June 2018 - 15:44
In continuare poti modifica programul tau sa detecteze automat daca-i \r\n, \n sau \r ( asta se foloseste pe Mac )
|
#9
Posted 26 June 2018 - 20:48
ursudepadure, on 26 iunie 2018 - 13:17, said:
Da, o sa incerc sa fac toate astea in notepad++ ca acolo pot inlocui \r\n cu altceva fara bataie de cap, direct cu "replace". S-a intamplat sa am nevoie sa adaug chestii de genul \r\n in loc de spatiu sa asez cuvintele dintr-un text unul sub altul. Notepad++ e aur curat la chestii din astea. Nu stiam ca in linux \r\n este doar \n´. Informatie foarte utila, merci fain! Asta era, intradevar. Am folosit "replace" in notepad++ si am inlocuit \r\n cu \n. Acuma merge brici si in Linux. Merci de sfat. Cum te mai lovesti de o problema cross-platform si o rezolvi, pac mai pui o functie si tot asa. Si o sa ai propriul API cross-platform incetul cu incetul. Si nu uita, desi tu in editor vezi cate o valoare pe fiecare linie, in realitate ai un singur rand , in care valorile tale sunt asezate cum ti-am spus mai sus. Bafta. |
#10
Posted 27 June 2018 - 06:57
Daca sint fisiere care vin de la senzori, este realista folosirea fisierelor de pe WIndows pe Linux? Daca sint doar fisiere de test, foloseste git si seteaza core.autocrlf = true sau foloseste .gitattributes la nivel de repository.
Daca ai nevoie de fisiere de date cross-platform, good luck cu cross-platform bullshit, probabil o sa vrei sa eviti metoda cirnatzului de ifdef-uri si sa faci separarea prin makefile, cu un header comun si cite un cpp cu implementarea pentru fiecare platforma... |
|
#11
Posted 29 June 2018 - 06:30
De fapt trebuie sa integrez niste fisiere care sunt generate in MATLAB (acolo sa vezi carnat de ifdef-uri). Ceea ce am scris era doar experimental, intradevar, acele valori vor veni de la senzori.
Am reusit sa le compilez, fisierele generate de MATLAB coder atat in Windows cat si in Linux fara probleme, desi pare nebunie curata: si pentru o simpla adunare MATLAB coder genereaza cel putin 30 de fisiere C sau C++. Am scris in Windows ca merge mai repede, era mai la indemana si pentru ca rutina de citit din fisiere nu era big deal. Sau asa credeam eu...Desigur, cu ocazia asta voiam sa verific cat de compatibile sunt fisierele C/C++ scrise in Windows pe Linux. Cu Java nu exista probleme de compatibilitate, nu am avut nici o problema pana acuma si nici cu Python, ceea ce era de asteptat dar nu am avut nevoie sa scriu programe C in Linux prea des. Va multumesc mult pentru sfaturi. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users