Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Matt91111

[C] Liczenie dni od do

Rekomendowane odpowiedzi

Dla mnie wszystko wygląda w porządku ale z debugera widzę że rok(2017), msc(14337), dzn(16).

Miesiąc powinien być 4 :E i pojęcia nie mam jak się to tam znalazło jak wszystkie dane z jednej struktury pochodzą :hmm:

 

//w funkcji policz_dni
dni+=_dni[0][msc]; // <-------- Segmentation fault. 

 

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

#define MIN_ROK 1900
#define ROK_PRZE 1904

struct Data {
  unsigned int Rok;
  unsigned int Miesiac;
  unsigned int Dzien;
} D;

struct LataPrzestepne {
  int* pLata; //pLata[];
  int SzPLata;
  int n;
};

typedef struct Data Data;
typedef struct LataPrzestepne LataPrzestepne;

bool dodaj_rok(int rok, LataPrzestepne * lataprzestepne);
void lata_przestepne_od(int od, int _do, LataPrzestepne * lataprzestepne);
int policz_dni(Data * od, Data * _do) ;

int _dni[2][12] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
              {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
/* 0 - normalny
   1 - prze
*/

int main()
{
   int i;
   int dni;

   struct LataPrzestepne LP = {0, 0, 0};

   Data od = {1997, 04, 16};
   Data _do = {2017, 01, 02};

   lata_przestepne_od(1997, 2017, &LP);//liczymy wszystkie lata przestepne od 1997 do 2017

   dni = policz_dni(&od, &_do);

   for(i = 0; i < LP.n; i++) {//korekta dni dla lat przestepnych
      dni++; //dla kazdego roku przestepnego jeden dzien wiecej
   }

   printf("Od %d.%d.%d do 2017.01.02 minęło: \n", od.Rok, od.Miesiac, od.Dzien);

   return 0;
}

int policz_dni(Data * od, Data * _do) {
  int rok = od->Rok;
  int msc = od->Miesiac;
  int dzn = od->Dzien;
  int dni = 0;

  while(true) {
     if(rok == _do->Rok) {
        break;
     }
     else {
        dni+=365;
        rok++;
     }
  }

  while(true) {
     if(msc == _do->Miesiac) break;
     else {
        dni+=_dni[0][msc]; // <--------
        msc++;
     }
  }

  dni+=dzn;//kilka brakujacych dni

  return dni;
}

void lata_przestepne_od(int od, int _do, LataPrzestepne * lataprzestepne) {
  int i;

  lataprzestepne->SzPLata = 0;
  lataprzestepne->pLata = malloc(lataprzestepne->SzPLata);

  for(i = ROK_PRZE; i < _do; i+=4) {
     if(i >= od && i <= _do) {
        dodaj_rok(i, lataprzestepne);
     }
  }
}

bool dodaj_rok(int rok, LataPrzestepne * lataprzestepne) {
  lataprzestepne->SzPLata = lataprzestepne->SzPLata + sizeof(rok);
  lataprzestepne->pLata = realloc(lataprzestepne->pLata, lataprzestepne->SzPLata);

  if(lataprzestepne->pLata) {
     lataprzestepne->n++;
     lataprzestepne->pLata[lataprzestepne->n - 1] = rok;
     return true;
  }
  else return false;
}


Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

g++ test.cpp -Wall -Wextra

 

b.cpp: In function ‘int policz_dni(Data*, Data*)’:
b.cpp:64:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      if(rok == _do->Rok) {
         ~~~~^~~~~~~~~~~
b.cpp:74:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      if(msc == _do->Miesiac) break;
         ~~~~^~~~~~~~~~~~~~~
b.cpp: In function ‘void lata_przestepne_od(int, int, LataPrzestepne*)’:
b.cpp:90:34: error: invalid conversion from ‘void*’ to ‘int*’ [-fpermissive]
   lataprzestepne->pLata = malloc(lataprzestepne->SzPLata);
                           ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
b.cpp: In function ‘bool dodaj_rok(int, LataPrzestepne*)’:
b.cpp:101:35: error: invalid conversion from ‘void*’ to ‘int*’ [-fpermissive]
   lataprzestepne->pLata = realloc(lataprzestepne->pLata, lataprzestepne->SzPLata);
                           ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

także tego - to się nie kompiluje :E

 

po dodaniu

-fpermissive

oczywiście seg fault

 

po dodaniu

-fsanitize=undefined

 

test.cpp:76:27: runtime error: signed integer overflow: 1920234279 + 1975969303 cannot be represented in type 'int'
Naruszenie ochrony pamięci (zrzut pamięci)

 

po dodaniu

-fsanitize=address

 

=================================================================
==22057==ERROR: AddressSanitizer: global-buffer-overflow on address 0x000000602120 at pc 0x400e24 bp 0x7fff69a05c80 sp 0x7fff69a05c78
READ of size 4 at 0x000000602120 thread T0
   #0 0x400e23 in policz_dni(Data*, Data*) test.cpp:76
   #1 0x400b7c in main test.cpp:46
   #2 0x7fb2f5533f44 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21f44)
   #3 0x400988 (test.out+0x400988)

0x000000602120 is located 0 bytes to the right of global variable '_dni' from 'test.cpp' (0x6020c0) of size 96
SUMMARY: AddressSanitizer: global-buffer-overflow test.cpp:76 policz_dni(Data*, Data*)
Shadow bytes around the buggy address:
 0x0000800b83d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 0x0000800b83e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 0x0000800b83f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 0x0000800b8400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 0x0000800b8410: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0000800b8420: 00 00 00 00[f9]f9 f9 f9 00 00 00 00 00 00 00 00
 0x0000800b8430: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 0x0000800b8440: 00 00 00 00 00 04 f9 f9 f9 f9 f9 f9 00 00 00 00
 0x0000800b8450: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 0x0000800b8460: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 0x0000800b8470: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
 Addressable:           00
 Partially addressable: 01 02 03 04 05 06 07 
 Heap left redzone:       fa
 Heap right redzone:      fb
 Freed heap region:       fd
 Stack left redzone:      f1
 Stack mid redzone:       f2
 Stack right redzone:     f3
 Stack partial redzone:   f4
 Stack after return:      f5
 Stack use after scope:   f8
 Global redzone:          f9
 Global init order:       f6
 Poisoned by user:        f7
 Contiguous container OOB:fc
 ASan internal:           fe
==22057==ABORTING

 

czytałeś w ogóle jakąś książkę o C?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

to czy C czy C++ nie ma różnicy - założyłeś już kilka wątków a w każdym problemy z pisaniem po nieswojej pamięci :E

poszukaj sobie jakichś materiałów w tym temacie (alokacja i zwalnianie pamięci, C stringi, operacje na wskaźnikach)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...