Skocz do zawartości

Operacje plikowe, czy mogę po raz drugi przypisać wartość pod wskaźnik?


Pomocna odpowiedź

(edytowany)
3 minuty temu, ethanak napisał:

pytanie: czy kolejność rekordów jest ważna?

Niema znaczenia, aha czyli po odczytaniu przekształcić na listę

Edytowano przez _LM_
(edytowany)

To jeszcze dorzucę funkcję która przerabia mi plik csv na tablicę wartości które mają być później użyte

void decode_csv(const char * str, int line_num)
{

printf("1\n");
//	printf("len num %d %d\n",strlen(str),line_num);
	static int licznik;
	if(line_num > 0)
	{
		lnum = line_num;
		licznik = 0;

		free(regptr);
		free(namepar);
			
	    regptr = (mb_param_request_t*)malloc(line_num * sizeof(mb_param_request_t)) ;	
		namepar = (name_and_unit_t*)malloc(line_num * sizeof(name_and_unit_t));
		return;
	}
	
	printf("2\n");
	vTaskDelay(10);
//	regptr[licznik].command = 0x01;
 char* token = strtok((char*)str, ",");
 uint8_t nrtok = 0;			
		
		while (token != NULL) {
      //  printf("%d   %s\n",n, token);


        switch (nrtok) {
			case 0:
			strcpy(namepar[licznik].name, token);
			printf("copy %s\n",namepar[licznik].name);
			
			break;
			case 1:
			regptr[licznik].slave_addr = atoi(token);
			break;
			
			case 2:
			regptr[licznik].command = atoi(token);
			break;
			
			case 3:
			regptr[licznik].reg_size = atoi(token);
			break;
		
			case 4:
			regptr[licznik].reg_start = atoi(token);
			break;
			
			case 5:break;
			case 6:
			strcpy(namepar[licznik].unit, token);
			break;
			default:break;

		}			
		
        token = strtok(NULL, ",");
        nrtok++;
    }		
//printf("memnum %d\n", line_num);
   	licznik++;
}

Przy pierwszym wywołaniu alokuję pamięć, drugie wywołanie to już rozłożenie wierszy na dane które są potrzebne do późniejszego działania.

Poniżej gotowy log w konsoli

2024-09-16 10:44:55, 29.5°C 
W (5273887) MASTER_TEST: I1 0.197391A
2024-09-16 10:44:56, 29.5°C 
W (5274407) MASTER_TEST: P1 42.153717VA
W (5274927) MASTER_TEST: U1 237.198730V
2024-09-16 10:44:57, 29.5°C 
W (5275447) MASTER_TEST: I1 0.176904A
W (5275967) MASTER_TEST: P1 42.242077VA

 

Edytowano przez _LM_

Jak nie ma znaczenia to proste (nie wnikałem w decodecsv i tak dalej):

struct myList {
    struct myList *next;
    struct csvRecord record;
};

void listInsert(struct myList **lista, struct myList *item)
{
    item -> next = *lista;
    *lista = item;
}

void listNext(struct myList *item)
{
    return item->next;
}

void listFree(struct myList **lista)
{
    struct myList *ml;
    while (*lista) {
        ml = *lista;
        *lista = ml->next;
        free(ml);
    }
}


// fragment kodu

struct myList *csvList = NULL;

#define CSV_BUF_SIZE 80

int readCsvFile(const char *fname)
{
    char buf[CSV_BUF_SIZE];
    FILE *f;
    if (!(f=fopen(fname,"r"))) return 1; // sprawdź errno
    listFree(&csvList);
    while (fgets(buf,CSV_BUF_SIZE,f)) {
        struct myList *item = ps_malloc(sizeof(*item));
        decodeCSV(buf, &item->record);
        listInsert(&csvList, item);
    }
    fclose(f);
    return 0;
}

Czy jakoś tak...

 

Byłem blisko 😄 
 

void addNew(record_t ** lista, record_t * new)
{
     new->next=NULL;
 
     if((*lista)==NULL)
     {
      *lista = new;
                     }
     else
     {
         record_t * wsk = *lista;
         while(wsk->next != NULL)
         {
              wsk = wsk->next;
            }
         
         wsk->next = new;
     }  
 }

 

(edytowany)

Cholera, fajne to. Iii można by jeszcze inaczej podejść co zdaje się byłoby prostsze. W sumie po co mi trzymać przekształcone typy w pamięci skoro mógłbym skopiować plik csv i w locie dekodować. Danych może nieco więcej, ale ten plik akurat nie będzie jakiś ogromny mogę sobie na to pozwolić za to obsługa uproszczona.

Edytowano przez _LM_
(edytowany)

Warto jeszcze zabezpieczyć się przed pustą linią (niech decodeCSV zwraca coś sensownego np. 0 jeśli jest ok i 1 jeśli nie i ustawia errno)

Edytowano przez ethanak
  • Lubię! 1
1 minutę temu, ethanak napisał:

Warto jeszcze zabezpieczyć się przed pustą linią

Tak, już podczas pisania tego "dekodera" chodziło mi po głowie że trzeba sprawdzić poprawność tego co przetwarza, np: gdyby zamiast liczby jakiś śmieszek wpisał ciąg znaków itd

(edytowany)

Jakby nie to że zakładam że ktoś będzie chciał to ręcznie edytować to dałbym na końcu linii CRC i po krzyku. Program prosty do tworzenia csv napiszę, wtedy mógłby obliczać sumy kontrolne jednak wtedy uzyszkodnik musiałby tylko z tego korzystać a wątpię aby komuś chciało się ręcznie liczyć CRC . 

Edytowano przez _LM_

Posiedziałem trochę wczoraj i dzisiaj i mam już pierwsze w miarę poprawne wykresy. Poniżej pobór prądu przez mojego lapka 🙂
chrome_bE3eG98meb.thumb.png.8346de74a72d8ee6e185f4719bcbcf19.png

Dzięki @ethanak za porady, nie wszystko udało się wdrożyć ale ważne że już coś tam się dzieje.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...