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.