Bonjour, je viens du C et je dois avouer qu'a mon grand age, j'ai du mal à bien saisir les subtilités du C++.
Je dois faire une toute petite modif d'une fonction:
A la ligne 23 il semblerait qu'on crée un ojet string qui s'apelle raw, et on lui assigne une valeur qui vient d'une focntion.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 bool BaseRTSPAppProtocolHandler::HandleRTSPResponse200Options( RTSPProtocol *pFrom, Variant &requestHeaders, string &requestContent, Variant &responseHeaders, string &responseContent) { if (pFrom->HasConnectivity()) { //FINEST("This is a keep alive timer...."); return true; } if (!pFrom->GetCustomParameters().HasKeyChain(V_STRING, true, 1, "connectionType")) { FATAL("Bogus connection"); pFrom->EnqueueForDelete(); return false; } //1. Sanitize if (!responseHeaders[RTSP_HEADERS].HasKey(RTSP_HEADERS_PUBLIC, false)) { FATAL("Invalid response:\n%s", STR(responseHeaders.ToString())); return false; } //2. get the raw options string raw = responseHeaders[RTSP_HEADERS].GetValue(RTSP_HEADERS_PUBLIC, false); } printf("RAW HEADER: %s \n", STR(raw)); }
C'est parfait, je vois à peu près.
Ce que je voudrais faire, c'est, en cas d'erreur, forcer la valeur de la string raw. Voici comment je m'y prends mal:
Je crée mon string raw en ligne 5.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 bool BaseRTSPAppProtocolHandler::HandleRTSPResponse200Options( RTSPProtocol *pFrom, Variant &requestHeaders, string &requestContent, Variant &responseHeaders, string &responseContent) { string raw; if (pFrom->HasConnectivity()) { //FINEST("This is a keep alive timer...."); return true; } if (!pFrom->GetCustomParameters().HasKeyChain(V_STRING, true, 1, "connectionType")) { FATAL("Bogus connection"); pFrom->EnqueueForDelete(); return false; } //1. Sanitize if (!responseHeaders[RTSP_HEADERS].HasKey(RTSP_HEADERS_PUBLIC, false)) { FATAL("Invalid response:\n%s", STR(responseHeaders.ToString())); //return false; //1.b if no Public field in the header, force the raw options string raw = "DESCRIBE, PAUSE, PLAY, SETUP, TEARDOWN, OPTIONS, SET_PARAMETER"; } else { //2. get the raw options string raw = responseHeaders[RTSP_HEADERS].GetValue(RTSP_HEADERS_PUBLIC, false); } printf("RAW HEADER: %s \n", STR(raw)); }
Puis si la réponse n'est pas bonne, je la force en ligne 21, sinon, je fais comme avant en ligne 25.
Ce qui ne marche pas, c'est que dans le premier cas, mon printf ligne 26 me renvoie bien la valeur reçue, mais dans le second ligne 28, il est toujours vide.
Ce qui m'interpelle:
C'est qu'en ligne 21 et 25, si je ne mets pas string devant raw, j'ai une erreur de compilation. Ce qui me laisse supposer que la variable raw n'est définie qu'entre les accolades, et que pour chaque bloc, j'ai un raw différent.
l'erreur:
Si une Grande âme pouvait m'expliquer comment me dépatouiller de ça, ce serait le premier rayon de soleil de ma pauvre semaine.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 note: candidates are: /usr/include/c++/4.6/bits/basic_string.h:541:7: note: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>] /usr/include/c++/4.6/bits/basic_string.h:549:7: note: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>] <near match>
Partager