cout << mylone z przesunięciem bitowym 3344 4

O temacie

Autor Gandalf

Zaczęty 12.08.2011 roku

Wyświetleń 3344

Odpowiedzi 4

Gandalf

Gandalf

Użytkownicy
posty7
Propsy16
Profesjabrak
  • Użytkownicy
Ave. Piszę program, którego celem jest wypisanie dźwięków konkretnej gamy durowej/molowej na podstawie podanej toniki... Ale do tego daleko, bo problem napotkałem już na samym początku przygotowań. Potrzebowałem jakiejś reprezentacji skali chromatycznej (12 dźwięków), wybrałem do tego celu tablicę typów wyliczeniowych. Następnie trzeba było znaleźć sposób na przekształcenie wartości typu wyliczeniowego na ciąg znaków(a raczej jeden, dwa znaki plus znak null, takie jak C, C#), aby można było to "po ludzku" wypisać strumieniem wyjścia, zamiast oglądać ciąg liczb. Tę funkcję napisałem tylko w części(dla samego dźwięku C), bo już widać, że w ten sposób nie zadziała. Funkcja nazywa się NumToNote, jest typu string i przyjmuje jako argument typ wyliczeniowy note. Komunikat błędu jest monstrualnie długi, ale jego początek (binary '<<' : no operator found which takes a right-hand operand of type 'std::string') jak na moje sugeruje, że kompilator potraktował "<<" jak operator przesunięcia bitowego. Jak to się dzieje? Jest jakiś sposób na wypisanie stringa strumieniem wyjścia przez jego nazwę? Pytam, bo identyczny błąd pojawiał się wtedy, gdy tworzyłem zmienną typu string(czy tablicę const char, jak kto woli) pod jakąś konkretną nazwą i przypisywałem do niej wartość funkcji dla chromatic[0], czyli note C, co odpowiada wartości 0. Przy samym przypisaniu kompilacja i działanie przebiegały bez zarzutu, za to przy próbie wypisania sposobem cout << nazwa_stringa; wszystko się sypało. Swoją drogą kolega stwierdził, że to może być wina kompilatora (Visual C++ 2008 Express Edition), ale coś w to wątpię. Polecał też usunąć using namespace std i powpisywać std:: ręcznie, ale to też nic nie pomogło.
Na wszelki wypadek załączam kod źródłowy, póki co jest krótki...
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
enum note { C, Cis, D, Dis, E, F, Fis, G, Gis, A, Bb, B};

string NumToNote(note nuta)
{
string wynik;
if(nuta = C) wynik = "C";
return wynik;
}
int _tmain(int argc, _TCHAR* argv[])
{
note chromatic[12];
chromatic[0] = C;
chromatic[1] = Cis;
chromatic[2] = D;
chromatic[3] = Dis;
chromatic[4] = E;
chromatic[5] = F;
chromatic[6] = Fis;
chromatic[7] = G;
chromatic[8] = Gis;
chromatic[9] = A;
chromatic[10] = Bb;
chromatic[11] = B;
cout << NumToNote(chromatic[0]) << endl;
system("pause");
return 0;
}
PS. zaciekawiła mnie też jedna rzecz. Na początku tablica chromatic miała rozmiar 11(w końcu indeksy od 0, czyli 12 miejsc), a jednak pojawiał się błąd stack around the variable corrupted. Problem zniknął po zmianie rozmiaru na 12, ale dlaczego 12, a nie 11?
Mam nadzieję, że wystarczająco dokładnie opisałem problem, byłbym wdzięczny za pomoc.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja

Adanos
Administrator

cout << mylone z przesunięciem bitowym
#1 2011-08-12, 18:40(Ostatnia zmiana: 2011-08-12, 18:47)
Cytuj
PS. zaciekawiła mnie też jedna rzecz. Na początku tablica chromatic miała rozmiar 11(w końcu indeksy od 0, czyli 12 miejsc), a jednak pojawiał się błąd stack around the variable corrupted. Problem zniknął po zmianie rozmiaru na 12, ale dlaczego 12, a nie 11?
Tak to nie działa. Jeśli rozmiar był 11, to indeksy są od 0 do 11-1=10.

Reszta za chwilę, muszę zainstalować kompilator :D

EDYCJA

Tak działa w Code::Blocksie :D
//#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
enum note {     C, Cis, D, Dis, E, F, Fis, G, Gis, A, Bb, B};

string NumToNote(note nuta)
{
        string wynik;
        if(nuta == C) wynik = "C";
        else wynik = "jakiś wynik";
        return wynik;
}
int main()
{
        note chromatic[12];
        chromatic[0] = C;
        chromatic[1] = Cis;
        chromatic[2] = D;
        chromatic[3] = Dis;
        chromatic[4] = E;
        chromatic[5] = F;
        chromatic[6] = Fis;
        chromatic[7] = G;
        chromatic[8] = Gis;
        chromatic[9] = A;
        chromatic[10] = Bb;
        chromatic[11] = B;
        cout << NumToNote(chromatic[0]) << endl;
        //system("pause");
        return 0;
}

Tu masz źle:if(nuta = C) wynik = "C";
powinno być:
if(nuta == C) wynik = "C";

Gandalf

Gandalf

Użytkownicy
posty7
Propsy16
Profesjabrak
  • Użytkownicy
Choroba... Faktycznie. Długo nic nie programowałem i powrót jest bolesny.
Cytuj
if(nuta == C) wynik = "C";
Nawet nie sobie nie wyobrażasz, jak epickiego facepalma strzeliłem, gdy to przeczytałem. Najbardziej podstawowy błąd, chyba się zabiję.
Dzięki za pomoc, ale to nie koniec - bo mimo to problem wciąż ten sam. Taki pseudowarunek(cośtam = cośtam)traktowany jest w końcu jako zawsze prawdziwy, czyli na jedno wychodzi. Wciąż nie daje się wyświetlić...
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja

Adanos
Administrator

cout << mylone z przesunięciem bitowym
#3 2011-08-12, 18:56(Ostatnia zmiana: 2011-08-12, 19:05)
No, nie wiem, może zmień kompilator?:

Trochę pozmieniałem w twoim kodzie wyżej...

EDYCJA
Cytuj
Taki pseudowarunek(cośtam = cośtam)traktowany jest w końcu jako zawsze prawdziwy, czyli na jedno wychodzi.
To nie do końca prawda... W twoim wypadku if(nuta = C) przyjmował wartość 0, bo C było pierwszym elementem typu wyliczeniowego note, indeksowanego od zera. Gdybyś dał if(nuta = Cis) to by była 1, if(nuta = D), była by dwójka itd.

Gandalf

Gandalf

Użytkownicy
posty7
Propsy16
Profesjabrak
  • Użytkownicy
O_O
Czegoś takiego się nie spodziewałem. Wolałbym kompilatora nie zmieniać, ale w takim razie chyba muszę... Nie ogarniam, dlaczego Visual tego nie rusza.
U mnie wygląda to tak:

A jeśli jakimś cudem się uruchomi, to wygląda to tak:


EDYCJA:
Racja. Ostatnimi czasy jestem cholernie ciemny.
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry