Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Amenintat cu moartea de un numar ...

La multi ani @AndReW99!

Alegere masina £15000 uk

TVR vrea sa lanseze o platforma d...
 Strategie investie pe termen lung...

Modulator FM ptr auto alimentat p...

orange cablu f.o. - internet fara...

Robinet care comuta traseul
 A fost lansata Fedora 40

Samsung S24 plus

Imi iau un Dell? (Vostro vs others)

Abonati Qobuz?
 transport -tren

Platforma electronica de eviden&#...

Cot cu talpa montat stramb in per...

Sfat achizitie sistem audio pentr...
 

Un program care ruleaza ok in Windows dar in aceleasi conditii nu pe Linux

- - - - -
  • Please log in to reply
10 replies to this topic

#1
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012
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
maccip

maccip

    46 ani

  • Grup: Senior Members
  • Posts: 33,254
  • Înscris: 06.01.2007
Cred ca trebuie sa fie ceva cu carriage return line feed.
Eu asta as verifica prima data.

#3
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Ataseaza fisiere exemple pentru toate ifstream.

#4
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012
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
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012
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
WinstonMontana

WinstonMontana

    Active Member

  • Grup: Members
  • Posts: 1,913
  • Înscris: 20.02.2018

View Postursudepadure, 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.
Mai ursule tu ai citit ce ti-a scris maccip sau mai bine zis AI INTELES ce ti-a zis ?
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
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012
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
modoran

modoran

    Senior Member

  • Grup: Senior Members
  • Posts: 8,390
  • Înscris: 08.02.2011
In continuare poti modifica programul tau sa detecteze automat daca-i \r\n, \n sau \r ( asta se foloseste pe Mac )

#9
WinstonMontana

WinstonMontana

    Active Member

  • Grup: Members
  • Posts: 1,913
  • Înscris: 20.02.2018

View Postursudepadure, 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.
Cu placere, poti incepe sa-ti faci propriul "lib" in care iti pui o functie care face asta automat si astfel faci prima functie cross-platform a ta.
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
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
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
ursudepadure

ursudepadure

    Junior Member

  • Grup: Members
  • Posts: 232
  • Înscris: 28.04.2012
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

Chirurgia spinală minim invazivă 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate