Jump to content
Tomczykolacz

Rozwiązany: Znów problemy w C++. Aż 10 błędów :/

Recommended Posts

Witam! Mam dany kod, który u kolegi działa (wysyłał filmik pokazujący, że faktycznie tak jest) u mnie nie, same errory. Do posta dołączam krótki filmik pokazujący treści oraz lokalizację w kodzie owych błędów. A poniżej sam kod.:


#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include <conio.h>
// definicje kodow klawiszy sterujacych
const char esc = 27;
const char moveUp = 72;
const char moveDown = 80;
const char moveLeft = 75;
const char moveRight = 77;
const char zoomIn = '+';
const char zoomOut = '-';
using namespace std;
// deklaracje funkcji
void HideCursor();
void Show(int x, int y, int size, char shape);
void Zoom(char direction, int& size, int x, int y);
void Move(char direction, int& x, int& y, int size);
// main
int _tmain(int argc, _TCHAR* argv[])
{
// pobranie parametrow programu
int x = _ttoi(argv[1]); // pierwotne polozenie figury
int y = _ttoi(argv[2]);
int size = _ttoi(argv[3]); // wstepny rozmiar figury
char shape = (argv[4])[0]; // znak uzyty do rysowania figury
bool exit = false; // flaga zakonczenia pracy programu
HideCursor();
while (!exit) {
system("cls"); // wyczysc ekran
Show(x, y, size, shape); // rysuj figure
char key = getch(); // pobierz kod nacisnieteto klawisza
if (key == esc) {
exit = true; // ESC - wyjscie z programu
}
else if (key == zoomIn || key == zoomOut) {
Zoom(key, size, x, y); // zmiana wielkosci figury
}
else if (key == moveUp || key == moveDown || key == moveLeft || key == moveRight) {
Move(key, x, y, size); // przesuniecie figury
}
}
// koniec pracy programu
system("cls");
return 0;
}
// funkcja ukrywa kursor
void HideCursor()
{
::HANDLE hConsoleOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
::CONSOLE_CURSOR_INFO hCCI;
::GetConsoleCursorInfo(hConsoleOut, &hCCI);
hCCI.bVisible = FALSE;
::SetConsoleCursorInfo(hConsoleOut, &hCCI);
}
// funkcja zwraca rozmiary okna (liczba kolumn i liczba wierszy)
void GetConsoleSize(int& width, int& height) {
width = 80;
height = 25;
}
// ustawia kursor na podanej pozycji
void GotoXY(int x, int y) {
static HANDLE h = NULL;
if (!h) {
h = GetStdHandle(STD_OUTPUT_HANDLE);
}
COORD c = { x, y };
SetConsoleCursorPosition(h, c);
}
// funkcja sprawdza, czy figura zmiesci sie cala na ekranie na podanych wspolrzednych
bool CanFit(int x, int y, int size) {
int height;
int width;
GetConsoleSize(width, height);
return (x >= 0 && y >= 0 && x < width - size && y < height - (2 * size - 2));
}
// funkcja rysuje figure na podanych wspolrzednych
void Show(int x, int y, int size, char shape) {
int height;
int width;
GetConsoleSize(width, height);
for (int i = 0; i < size; i++) {
// dolna polowka
GotoXY(x + i, height - (y + i) - 1);
cout << shape;
// gorna polowka
GotoXY(x + i, height - (y + 2 * (size - 1) - i) - 1);
cout << shape;
}
};
// funkcja zmienia rozmiar figury (jesli nowy rozmiar zmiesci sie na ekranie)
void Zoom(char direction, int& size, int x, int y) {
if (direction == zoomOut && size > 1) {
size--;
}
else if (direction == zoomIn) {
int oldSize = size;
size++;
if (!CanFit(x, y, size)) {
size = oldSize;
}
}
};
// funkcja przesuwa figure (jesli zmiesci sie na ekranie w nowych wspolrzednych)
void Move(char direction, int& x, int& y, int size) {
int oldX = x;
int oldY = y;
if (direction == moveLeft) {
x--;
}
else if (direction == moveRight) {
x++;
}
else if (direction == moveUp) {
y++;
}
else if (direction == moveDown) {
y--;
}
if (!CanFit(x, y, size)) {
x = oldX;
y = oldY;
}
};

A tu wspomniany filmik:

Link to comment
Share on other sites

Niech na samym początku doda

#include "stdafx.h"

Alternatywnie może zrezygnować z Precompiled Headers, np. przez przestawienie odpowiedniej flagi we właściwościach projektu.

PS Jakieś sprawdzenie ilości przekazanych parametrów wcale by nie zaszkodziło.

Link to comment
Share on other sites

Problemem jest to, że VS nie rozumie co to za funkcja _ttoi i co to za typ _TCHAR. Musisz dodać pliki nagłówkowe, w których te wartości są zdefiniowane.

Dołączenie pliku nagłówkowego tchar.h powinno rozwiązać problemy.

Link to comment
Share on other sites

OK, zobaczyłem powyższy post i coś mnie tknęło, żeby sprawdzić Twoją historię postów i nie jest dobrze. Rzekłbym nawet, że jest źle. Zastanów się, czy programowanie to na pewno zajęcie dla Ciebie.

Odpowiedź brzmi - tak, wystarczy taka linijka i powinno działać.

Edited by Sevard
Link to comment
Share on other sites

OK, zobaczyłem powyższy post i coś mnie tknęło, żeby sprawdzić Twoją historię postów i nie jest dobrze. Rzekłbym nawet, że jest źle. Zastanów się, czy programowanie to na pewno zajęcie dla Ciebie.

Odpowiedź brzmi - tak, wystarczy taka linijka i powinno działać.

Wiem o tym. Nie, nie jest to zajęcie dla mnie i nie zamierzam pracować jako programista. Ale za późno już by się wycofać. Zacząłem studiować informatykę, muszę jakoś skończyć studia i jakoś przebrnąć przez to nieszczęsne programowanie. W technikum też to miałem i chociaż nic się nie nauczyłem to jakoś zdałem. Skoro wtedy się udało to może teraz też. Pewnie się zastanawiasz czemu w takim razie wgl poszedłem na informatykę? Bo interesuje się komputerami od 5 roku życia, mam w nich pewną wiedzę i nie było jeszcze problemu którego nie umiałbym rozwiązać dotyczącego typowych awarii hard i softwarowych. Chciałem pójść na studia by poszerzyć swoją wiedzę w tej dziedzinie oraz pokazać innym że dam radę i przełamać stereotyp, że humanista nie ma szans w kierunku IT. Ale nie to jest tematem tego wątku, więc wracając: Zrobiłem jak mi poleciłeś Sevard. Teraz okienko Error list w VS nie pokazuje żadnych błędów, a jedynie 1 warning. Mimo to program wciąż się nie może skompilować.

Gdy to robię pojawia się komunikat ze screenu o nazwie Runtime library (pierwszy screen) i bez względu na to, którą opcję wybiorę z tych 3 pojawia się kolejne okno z błędem, widoczne na nast. screenie.

Martwię się, bo wciąż mi program nie działa, a na oddanie projektu mam czas do piątku 22.01 do północy. Mało czasu, a ja daleko w polu. Co z tego, że mam kod, skoro się on nie kompiluje? Program musi działać. To podstawowy wymóg zaliczenia. Błagam pomóżcie tak szybko jak potraficie!

post-649703-0-09130200-1453329805_thumb.

post-649703-0-97799900-1453329828_thumb.

Link to comment
Share on other sites

Jak na moje oko, to program się kompiluje i wracamy do tej kwestii:

Jakieś sprawdzenie ilości przekazanych parametrów wcale by nie zaszkodziło.

Dołóż na początku maina taki kod i powiedz, czy nadal się sypie

if (argc <5)
return -1;

Link to comment
Share on other sites

Wiem o tym. Nie, nie jest to zajęcie dla mnie i nie zamierzam pracować jako programista. Ale za późno już by się wycofać. Zacząłem studiować informatykę, muszę jakoś skończyć studia i jakoś przebrnąć przez to nieszczęsne programowanie. W technikum też to miałem i chociaż nic się nie nauczyłem to jakoś zdałem. Skoro wtedy się udało to może teraz też. Pewnie się zastanawiasz czemu w takim razie wgl poszedłem na informatykę? Bo interesuje się komputerami od 5 roku życia, mam w nich pewną wiedzę i nie było jeszcze problemu którego nie umiałbym rozwiązać dotyczącego typowych awarii hard i softwarowych.

W takim razie i tak wybrałeś złą drogę, bo informatyk awariami się nie zajmuje. Nie wiem na którym roku jesteś, ale im dalej, tym zadania będą trudniejsze, a studia to nie technikum. Tu raczej nie liczyłbym na to, że "jakoś zdasz".

Chciałem pójść na studia by poszerzyć swoją wiedzę w tej dziedzinie oraz pokazać innym że dam radę i przełamać stereotyp, że humanista nie ma szans w kierunku IT.

Humanista to człowiek wszechstronnie wykształcony, a nie ktoś, kto ma problemy z matematyką i logicznym myśleniem.

Ale nie to jest tematem tego wątku, więc wracając: Zrobiłem jak mi poleciłeś Sevard. Teraz okienko Error list w VS nie pokazuje żadnych błędów, a jedynie 1 warning. Mimo to program wciąż się nie może skompilować.

Jaki warning? Przeklej jego treść.

Gdy to robię pojawia się komunikat ze screenu o nazwie Runtime library (pierwszy screen) i bez względu na to, którą opcję wybiorę z tych 3 pojawia się kolejne okno z błędem, widoczne na nast. screenie.

W sumie na screenie masz podpowiedź, z której dobrze by było skorzystać - co na ten temat mówi dokumentacja?

  • Upvote 1
Link to comment
Share on other sites

Ok. Mała zmiana planów. Udało mi się przerobić kod i program wreszcie działa i się kompiluje. Niestety wymagało to usunięcia fragmentu który umożliwiał użytkownikowi podanie rozmiaru figury, co następnie powodowało, że program odczytywał te dane i rysował figurę wg podanych wartości. Obecnie kompilujący się i działający kod wygląda tak:


const char moveDown = 80;
const char moveLeft = 75;
const char moveRight = 77;
const char zoomIn = '+';
const char zoomOut = '-';
using namespace std;
// deklaracje funkcji
void HideCursor();
void Show(int x, int y, int size, char shape);
void Zoom(char direction, int& size, int x, int y);
void Move(char direction, int& x, int& y, int size);
// main
int main(int argc, char* argv[])
{
// pobranie parametrow programu
int x = 0; // pierwotne polozenie figury
int y = 0;
int size = 5; // wstepny rozmiar figury
char shape = '*'; // znak uzyty do rysowania figury
if (argc == 5) {
x = atoi(argv[1]); // pierwotne polozenie figury
y = atoi(argv[2]);
size = atoi(argv[3]); // wstepny rozmiar figury
shape = (argv[4])[0]; // znak uzyty do rysowania figury
}
bool exit = false; // flaga zakonczenia pracy programu
HideCursor();
while (!exit) {
system("cls"); // wyczysc ekran
Show(x, y, size, shape); // rysuj figure
char key = _getch(); // pobierz kod nacisnieteto klawisza
if (key == esc) {
exit = true; // ESC - wyjscie z programu
}
else if (key == zoomIn || key == zoomOut) {
Zoom(key, size, x, y); // zmiana wielkosci figury
}
else if (key == moveUp || key == moveDown || key == moveLeft || key == moveRight) {
Move(key, x, y, size); // przesuniecie figury
}
}
// koniec pracy programu
system("cls");
return 0;
}
// funkcja ukrywa kursor
void HideCursor()
{
::HANDLE hConsoleOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
::CONSOLE_CURSOR_INFO hCCI;
::GetConsoleCursorInfo(hConsoleOut, &hCCI);
hCCI.bVisible = FALSE;
::SetConsoleCursorInfo(hConsoleOut, &hCCI);
}
// funkcja zwraca rozmiary okna (liczba kolumn i liczba wierszy)
void GetConsoleSize(int& width, int& height) {
width = 80;
height = 25;
}
// ustawia kursor na podanej pozycji
void GotoXY(int x, int y) {
static HANDLE h = NULL;
if (!h) {
h = GetStdHandle(STD_OUTPUT_HANDLE);
}
COORD c = { x, y };
SetConsoleCursorPosition(h, c);
}
// funkcja sprawdza, czy figura zmiesci sie cala na ekranie na podanych wspolrzednych
bool CanFit(int x, int y, int size) {
int height;
int width;
GetConsoleSize(width, height);
return (x >= 0 && y >= 0 && x < width - size && y < height - (2 * size - 2));
}
// funkcja rysuje figure na podanych wspolrzednych
void Show(int x, int y, int size, char shape) {
int height;
int width;
GetConsoleSize(width, height);
for (int i = 0; i < size; i++) {
// dolna polowka
GotoXY(x + i, height - (y + i) - 1);
cout << shape;
// gorna polowka
GotoXY(x + i, height - (y + 2 * (size - 1) - i) - 1);
cout << shape;
}
};
// funkcja zmienia rozmiar figury (jesli nowy rozmiar zmiesci sie na ekranie)
void Zoom(char direction, int& size, int x, int y) {
if (direction == zoomOut && size > 1) {
size--;
}
else if (direction == zoomIn) {
int oldSize = size;
size++;
if (!CanFit(x, y, size)) {
size = oldSize;
}
}
};
// funkcja przesuwa figure (jesli zmiesci sie na ekranie w nowych wspolrzednych)
void Move(char direction, int& x, int& y, int size) {
int oldX = x;
int oldY = y;
if (direction == moveLeft) {
x--;
}
else if (direction == moveRight) {
x++;
}
else if (direction == moveUp) {
y++;
}
else if (direction == moveDown) {
y--;
}
if (!CanFit(x, y, size)) {
x = oldX;
y = oldY;
}
};

Co mogę zrobić, by dać możliwość wpisania rozmiaru figury, by znów nie było wysypywania się?

Link to comment
Share on other sites

Eh... zacznijmy od tego, że jak zaczynałeś studia to miałeś pół roku na zapoznanie się z językiem wykorzystywanym na zajęciach.

Patrząc na twoje problemy to ewidentnie ten fakt pominąłeś. Nie ma znaczenia, czy chcesz, czy nie chcesz się uczyć programowania. Podstawa programowa Informatyki im dalej w las zawiera programowanie znacznie wykraczające poza twój próbny program, który zrobiłeś na podstawie już istniejącego rozwiązania.

Twoje problemy nie wynikają też z samej niewiedzy, lecz braku analizy problemu, jak i chęci. Widzisz błąd i nie szukasz źródła problemu.

Po pierwsze jest to program odpalany z konsoli z argumentami, co jest bardzo widoczne w funkcji tmain na samym początku.

int _tmain(int argc, _TCHAR* argv[])

{

// pobranie parametrow programu

int x = _ttoi(argv[1]); // pierwotne polozenie figury

int y = _ttoi(argv[2]);

int size = _ttoi(argv[3]); // wstepny rozmiar figury

char shape = (argv[4])[0]; // znak uzyty do rysowania figury

bool exit = false; // flaga zakonczenia pracy programu

HideCursor();

while (!exit) {

system("cls"); // wyczysc ekran

Show(x, y, size, shape); // rysuj figure

Jeśli nie masz pojęcia, gdzie się program zaczyna to nie odpalisz go poprawnie.

Rada ode mnie. Zacznij się uczyć i szukać odpowiedzi, jak i analizować problemy szukając ich źródła(oraz czytając co mówi do ciebie kompilator) lub zmień kierunek.

Link to comment
Share on other sites

Ok problem rozwiązany. Doszedłem do tego. Teraz wszystko działa i projekt został wysłany.

Temat można by zamknąć, ale nim to ktoś zrobi jeszcze na kilka rzeczy muszę odpisać.

W takim razie i tak wybrałeś złą drogę, bo informatyk awariami się nie zajmuje. Nie wiem na którym roku jesteś, ale im dalej, tym zadania będą trudniejsze,

Jak to nie? Jak nie informatyk to kto? Teraz to mnie zbiłeś z tropu. :/ A odnośnie drugiej części cytatu, to jestem na samym początku studiów. Końcówka 1 semestru. 1 rok.

Humanista to człowiek wszechstronnie wykształcony, a nie ktoś, kto ma problemy z matematyką i logicznym myśleniem.

O dobrze gada, polać mu!

Link to comment
Share on other sites

W takim razie i tak wybrałeś złą drogę, bo informatyk awariami się nie zajmuje. Nie wiem na którym roku jesteś, ale im dalej, tym zadania będą trudniejsze,

Jak to nie? Jak nie informatyk to kto?

Serwisant. W przypadku problemów sprzętowych bardziej przydatne jest wykształcenie związane z elektroniką. W przypadku programowych - właściwie w tym przypadku może to być informatyk, ale często są to samouki, bez żadnego szczególnego wykształcenia - co najwyżej po jakichś kursach obejmujących np. działanie OSów.

Link to comment
Share on other sites

W takim razie i tak wybrałeś złą drogę, bo informatyk awariami się nie zajmuje. Nie wiem na którym roku jesteś, ale im dalej, tym zadania będą trudniejsze,

Jak to nie? Jak nie informatyk to kto?

Serwisant. W przypadku problemów sprzętowych bardziej przydatne jest wykształcenie związane z elektroniką. W przypadku programowych - właściwie w tym przypadku może to być informatyk, ale często są to samouki, bez żadnego szczególnego wykształcenia - co najwyżej po jakichś kursach obejmujących np. działanie OSów.

O, to właśnie kimś takim chciałbym być! A co do tego wątku, to jak wspomniałem wyżej: problem rozwiązany i temat do zamknięcia. Dziękuję wszystkim za pomoc i pozdrawiam.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.


  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...