• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zgłoszono wyjątek: naruszenie dostępu do zapisu. v było nullptr.

HackNation - ogólnopolski hackathon
0 głosów
1,744 wizyt
pytanie zadane 19 listopada 2019 w C i C++ przez bakobydlak Nowicjusz (160 p.)

Witam, potrzebuje pomocy- nie wiem gdzie znajduje sie moj blad przy wskaznikach:

#include "pch.h"
#include <iostream>
#include "sort.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int createTab(int** pTab,int nSize)
{
	*pTab = (int*)malloc(nSize * sizeof(int));
	if (pTab) memset(pTab, 0, nSize * sizeof(int));
	else return 0;
	return 1;
}	
void freeTab(int* pTab)//zwolnij tablice /mallock&memset & czy sie powiodlaelse null
{
	free(pTab);
}
void initTab(int* pTab, int nSize, int nVal)
{
	int *v = pTab; 
	for (int i = 0; i < nSize; i++)
	{
		*v = nVal; //TUTAJ BLAD WSKAZNIKA
		v++;
	}

}
void randomInit(int* pTab, int nSize) //srand&rand //modulo rozmiar -preferencje
{
	
	int *v = pTab;
	time_t tt;
	int zarodek = time(&tt);
	srand(zarodek);   // za zarodek wstawiamy pobrany czas w sekundach
	for (int i = 0; i < nSize; ++i)
	{
		*v = rand() % 999; //zleeeeee
		v++;
	}

void PrintTab(int* pTab, int nSize)
{
	int *v = pTab;
	for (int i = 0; i < nSize; i++)
	{
	printf("%d\t", *v);
	*v++;
	}
	
}
#include "pch.h"
#include <iostream>
#include "sort.h"
#include <stdio.h>

using namespace std;


int* pTab = NULL;
int* pomTab = NULL;

int main()
{
	int nSize = 0;
	printf("Podaj ilosc elementow do posortowania:\n");
	cin >> nSize;

	createTab(&pTab,nSize);
	initTab(pTab, nSize, 0);
	randomInit(pTab, nSize);
	PrintTab(pTab, nSize);
	freeTab(pTab);



	return 0;
}
#ifndef SORT_H
#define SORT_H

void freeTab(int* pTab);//zwolnij tablice /mallock&memset & czy sie powiodlaelse null
void initTab(int*, int nSize, int nVal);
void randomInit(int* pTab, int nSize); //srand&rand //modulo rozmiar -preferencje
void copyTab(int* pTab, int* pTabFrom, int nSize); //kopiuje do tabl z 2 do 1
void PrintTab(int* pTab, int nSize);
int createTab(int** pTab, int nSize);

#endif

 

komentarz 20 listopada 2019 przez tkz Nałogowiec (42,040 p.)

https://www.fluentcpp.com/2017/06/13/the-real-difference-between-struct-class/

O jakich fundamentach mówisz dokładnie? 

Zwracanie wartości null jest złym podejściem, gdy zamiast tego można zwrócić, powiedzmy, pustą tablicę.

Powoływałem się na słowa Robert C. Martin, a myślę, że jest jakimś autorytetem w świecie IT.

komentarz 20 listopada 2019 przez niezalogowany
edycja 20 listopada 2019
Ok poczytam, przemyślę i odpowiem, ale to pewnie nie wcześniej niż za miesiąc.

EDIT:: A to co pisze o C strukturze i to sam próbowałem wyklepać rozbudowaną strukturę  i no i nie było tak łatwo i przyjemnie. Ale to może wynikać z mojej nie znajomości C w tym zakresie.

Ps. A źródło fajne, bardzo dużo tam ciekawych rzeczy. Tylko ten czas :(;
komentarz 20 listopada 2019 przez adrian17 Mentor (354,880 p.)

Zwracanie wartości null jest złym podejściem, gdy zamiast tego można zwrócić, powiedzmy, pustą tablicę.

(Um... to raczej jest javowa rada? Bo W C++ie ona raczej nie ma sensu. Ale to już raczej nie jest temat na ten wątek, więc jak ktoś chce ciągnąć to PM)

komentarz 20 listopada 2019 przez tkz Nałogowiec (42,040 p.)

adrian17  jak na wszystko, to zależy...

komentarz 20 listopada 2019 przez mokrowski Mędrzec (158,940 p.)
1. Co do zasady, w C++ nie używa się malloc. Zresztą szereg metodyk tego zabrania (branża lotnicza, medyczna, automotive).

2. Co do "manualnej alokacji pamięci" (tak dla C jak i C++), zaleca się by alokacja i zwolnienie pamięci, odbywała się na tym samym poziomie abstrakcji. Czyli funkcja która alokuje, powinna (o ile to możliwe), zwalniać pamięć przed wyjściem z niej. (CERT Secure Coding Standards).

3. Co do sygnalizowania null'em braku alokacji, dla C jest to rzecz normalna. Dla C++ są lepsze sposoby (np. std::optional).

4. Od reguł są wyjątki. Np. Qt ma odmienną filozofię alokacji narzucaną przez framework.

5. Jest możliwość (choć powinna być wybierana z ostrożnością), by alokować dane poprzez argument przekazywany a poprzez return sygnalizować efekt działania. W wielu przypadkach taki kod może być mało czytelny. Czasem takie funkcje obejmuje dany standard (np. NVIDIA dla CUDA czy Khronos dla OpenCL robi to nagminnie). Dla C skutkuje to argumentem podwójnego wskaźnika.

1 odpowiedź

0 głosów
odpowiedź 20 listopada 2019 przez bakobydlak Nowicjusz (160 p.)
Dzieki za rady - ogolnie to sie sam uczylem troche c++ troche c ,a ze visual kompiluje jedno z drugim to smiga :D. U mnie osobiscie nie zadzialalo przez memset w createtab. Po odkomentowaniu program smiga

Podobne pytania

0 głosów
0 odpowiedzi 4,433 wizyt
0 głosów
1 odpowiedź 2,040 wizyt
0 głosów
1 odpowiedź 493 wizyt
pytanie zadane 6 czerwca 2022 w C i C++ przez kacper1445 Mądrala (5,070 p.)

93,628 zapytań

142,551 odpowiedzi

323,051 komentarzy

63,133 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 1936p. - dia-Chann
  2. 1916p. - DziarnowskiJ
  3. 1886p. - Łukasz Piwowar
  4. 1841p. - raydeal
  5. 1840p. - Adrian Wieprzkowicz
  6. 1640p. - CC PL
  7. 1616p. - Maurycy W
  8. 1588p. - Tomasz Bielak
  9. 1521p. - Michal Drewniak
  10. 1491p. - Rafał Trójniak
  11. 1471p. - rafalszastok
  12. 1444p. - robwarsz
  13. 1257p. - ssynowiec
  14. 1223p. - rucin93
  15. 1208p. - Mariusz Fornal
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...