Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - VB.NET e conversione codice da C# con ciclo FOR
Forum - C# / VB.NET - VB.NET e conversione codice da C# con ciclo FOR

Avatar
dylan666 (Normal User)
Pro


Messaggi: 129
Iscritto: 08/09/2009

Segnala al moderatore
Postato alle 1:03
Venerdì, 30/06/2023
Ciao a tutti, sto provando a riconvertire del codice C# in VB.NET, che mi è un po' più familiare.
Sono arrivato a questa parte che non capisco

Codice sorgente - presumibilmente C#

  1. const int BUFSIZE = 4 * 1024;
  2. byte [] buffer = new byte[BUFSIZE];
  3. string pqueue = "test";
  4. int pos = 0;
  5. buffer[pos++] = 2;
  6. for (int i = 0; i < pqueue.Length; i++)
  7. {
  8.     buffer[pos++] = (byte)pqueue[i];
  9. }
  10. buffer[pos++] = (byte) '\n';



In particolare non mi è chiaro cosa fa "buffer[pos++] = 2".
Sbaglio o il suo risultato è identico a scrivere "buffer[pos] = 2" ?
Il primo incremento è quindi "finto"?

Con dei convertitori online mi è uscito questo ma mi è ancora meno chiaro:

Codice sorgente - presumibilmente VB.NET

  1. Const BUFSIZE As Integer = 4 * 1024
  2.     Dim buffer As Byte() = New Byte(BUFSIZE)
  3.     Dim pqueue As String = "test"
  4.     Dim pos As Integer = 0
  5.     buffer(Math.Min(System.Threading.Interlocked.Increment(pos), pos - 1)) = 2
  6.  
  7.     For i As Integer = 0 To pqueue.Length - 1
  8.         buffer(Math.Min(System.Threading.Interlocked.Increment(pos), pos - 1)) = CByte(pqueue(i))
  9.     Next
  10.  
  11.     buffer(Math.Min(System.Threading.Interlocked.Increment(pos), pos - 1)) = CByte(vbLf)



Mi aiutate a capirci qualcosa?:-|

Ultima modifica effettuata da dylan666 il 30/06/2023 alle 1:37
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1198
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 22:13
Venerdì, 30/06/2023
pos++ significa: pos = pos + 1, che si può scrivere anche: pos += 1.
Mentre pos++ in C# si può mettere nell'indice, in Vb pos += 1 non si può mettere c'è bisogno di una riga in più.


Codice sorgente - presumibilmente VB.NET

  1. Const BUFSIZE As Integer = 4 * 1024
  2. Dim buffer(BUFSIZE - 1) As Byte
  3. Dim pqueue As String = "test"
  4. Dim pos As Integer = 0
  5. buffer(pos) = 2
  6. pos += 1
  7. For i As Integer = 0 To pqueue.Length - 1
  8.     buffer(pos) = Asc(pqueue.Chars(i))
  9.     pos += 1
  10. Next i
  11. buffer(pos) = Asc(vbLf)
  12. pos += 1 ' questa riga sarebbe inutile se il codice finisse qui, indispensabile se vuoi aggiungere altri codici ASCII nella posizione successiva a quella corrente ed usare pos come indice.



Se ti serve la spiegazione di cosa fa il codice riga per riga chiedi.




Ultima modifica effettuata da Carlo il 08/07/2023 alle 14:21


in programmazione tutto è permesso
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1198
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:54
Sabato, 01/07/2023
Testo quotato

Postato originariamente da dylan666:

In particolare non mi è chiaro cosa fa "buffer[pos++] = 2".
Sbaglio o il suo risultato è identico a scrivere "buffer[pos] = 2" ?
Il primo incremento è quindi "finto"?



In C/C++/C#/Java/JavaScript
pos++ significa: incrementa di 1 pos dopo aver eseguito l'istruzione
++pos significa: incrementa di 1 pos prima di aver eseguito l'istruzione

"buffer[pos++] = 2" è uguale a  "buffer[pos] = 2" solo se non consideri che ad istruzione eseguita pos sarà incrementato di 1

Tradotto in codice:
Codice sorgente - presumibilmente Plain Text

  1. buffer[pos++] = 2;


diventa:
Codice sorgente - presumibilmente Plain Text

  1. buffer(pos) = 2
  2. pos += 1


----------------------------
Codice sorgente - presumibilmente Plain Text

  1. buffer[++pos] = 2;


diventa:
Codice sorgente - presumibilmente Plain Text

  1. pos += 1
  2. buffer(pos) = 2


La differenza non è da sottovalutare.

Ultima modifica effettuata da Carlo il 01/07/2023 alle 18:08


in programmazione tutto è permesso
PM Quote