Ir ao conteúdo

C# erro na declaracao de array


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado

pessoal, sou iniciante e estou com esse erro simples abaixo. no entanto, mesmo simples não sei o que está errado. estou usando um livro como referencia, e apenas copiando.

da dois erros: "O nome 'nome' não existe no contexto atual" e "Token invalido '=' na declaracao de membro de classe, registro, struct ou interface"

 

  public decimal valor;
        decimal principal;
        decimal pss;
        string[] nome = new string[20];
                       
        nome[0] = "HELTON EDI XAVIER";

 

 

erroC#.jpg

Postado

@cimerio7 , bom dia.

 

Segue um exemplo de utilização de Strings na Linguagem C.


 

/******************************************************************************
Exemplo de utilização de strings para cimerio7
*******************************************************************************/

#include <stdio.h>

int main()
{
    // Declarar uma variável string
    char nome[] = "Diego Mendes Rodrigues";
    printf("%s\n", nome);
    
    // Declarar um Array de variávels do tipo string
    char *nomes_array[] = {"Regina Marcia", "Bruna Lobato", "Ingrid Bittar"};
    printf("\nOs elementos do array de strings são:\n");
    for (int i = 0; i < 3; i++)
    {
        printf("%s\n", nomes_array[i]);
    }
    
    // Outra forma de declarar um array de variávels do tipo string 
    char arr[3][10] = {"Luciana", "Cláudio", "Karolina"};
    printf("\nOs elementos do outro array de strings são:\n");
    for (int i = 0; i < 3; i++)
    {
        printf("%s\n", arr[i]);
    }

    return 0;
}

 

Segue um link desse código para testes:

https://onlinegdb.com/nMO2gmnwE

 

Espero ter ajudado!

Abraço,

Diego

  • Confuso 1
Postado
  Em 10/08/2023 às 14:04, cimerio7 disse:

pessoal, sou iniciante e estou com esse erro simples abaixo. no entanto, mesmo simples não sei o que está errado. estou usando um livro como referencia, e apenas copiando.

da dois erros: "O nome 'nome' não existe no contexto atual" e "Token invalido '=' na declaracao de membro de classe, registro, struct ou interface"

 

  public decimal valor;
        decimal principal;
        decimal pss;
        string[] nome = new string[20];
                       
        nome[0] = "HELTON EDI XAVIER";
Expandir  

 

@cimerio7 ,

 

Segue um exemplo em C++ com strings.
 

/******************************************************************************
Exemplo de utilização de strings no C++ para o cimerio7
*******************************************************************************/
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    // Criar a variável 'nome' do tipo string e prencher seu conteúdo
     string nome = "Diego Rodrigues";
     cout<<nome<<endl;
     
     // Criar uma string através de uma variável (um vetor) do tipo char e prencher seu conteúdo
     char formacao[] = "Engenheiro Eletricista - Ênfase em Telecomunicações";
     cout<<formacao<<endl;
     
     // Criar uma string através de uma variável (um vetor) do tipo char com um tamanho definido
     char cidade[50];
     // Preencher a variável cidade copiando a string "Paulínia" para dentro dela
     strcpy(cidade, "Paulínia");
     cout<<cidade<<endl;

    return 0;
}

 

Segue um link desse código para testes:

https://onlinegdb.com/i4aS8o-Xw

 

Espero ter ajudado!

Abraço,

Diego

  • Confuso 1
Postado

@cimerio7 Faltou colocar a atribuição no escopo de uma função, p.ex,

 

namespace aprendizado{
    internal class Cedidos{
        void teste(){
            decimal principal;
            decimal pss;
            string[] nome = new string[20];
                       
            nome[0] = "HELTON EDI XAVIER";
        }
    }
}

 

Postado
  Em 10/08/2023 às 16:55, Midori disse:

@cimerio7 Faltou colocar a atribuição no escopo de uma função, p.ex,

 

namespace aprendizado{
    internal class Cedidos{
        void teste(){
            decimal principal;
            decimal pss;
            string[] nome = new string[20];
                       
            nome[0] = "HELTON EDI XAVIER";
        }
    }
}

 

Expandir  

Midori, não entendo , porque eu preciso colocar no escopo de uma função . as declarações das variáveis decimais estavam funcionando sem isso 

Postado

Olá!@cimerio7, o que dizem — nos guia de programação C# — dos nomes nas 'class' ?

— Suponho que alguns desses nomes são campos, e que os campos são/ou/não inicializados na declaração.

 

  Em 10/08/2023 às 14:04, cimerio7 disse:

estou com esse erro simples

Expandir  

Aparentemente, é um erro inicializar pós-declaração. Sendo, talvez, ideal inicializar o campo com 20 argumentos na declaração.

Postado
  Em 10/08/2023 às 17:39, cimerio7 disse:

Midori, não entendo , porque eu preciso colocar no escopo de uma função . as declarações das variáveis decimais estavam funcionando sem isso

Expandir  

O erro está na atribuição e não na declaração. Se preferir pode declarar fora do escopo.

Postado

alguém pode olhar o meu primeiro post e copiar aqui só a linha que está com erro? 

  Em 10/08/2023 às 17:42, mauro_b disse:

Olá!@cimerio7, o que dizem — nos guia de programação C# — dos nomes nas 'class' ?

— Suponho que alguns desses nomes são campos, e que os campos são/ou/não inicializados na declaração.

 

Aparentemente, é um erro inicializar pós-declaração. Sendo, talvez, ideal inicializar o campo com 20 argumentos na declaração.

Expandir  

mauro, no livro está exatamente assim. 

Postado

Poste algo completo, compilável.

 

E se possível diga o ambiente que está usando, IDE, editor, essas coisas.

 

Fora da inicialização você precisa de uma instância da classe para mudar os valores e é isso que o compilador está tentado te dizer.

 

 

Veja um exemplo

 

    class Cedidos
    {
        public decimal valor;
        decimal principal;
        decimal pss;
        public string[] nome = new string[5];
        public void numera()
        {
            for (int i = 0; i < nome.Length; i += 1)
                nome[i] = $"[Nome {i}...]";
        }
        public void mostra()
        {
            Console.WriteLine($"Sao {nome.Length} nomes:");
            for (int i = 0; i < nome.Length; i += 1)
                Console.WriteLine($"    {i} \"{nome[i]}\"");
            Console.WriteLine("");
        }
    }

 

Essa é a sua mesma classe com mais duas funções. São chamadas métodos nesse caso, eu acho. numera() faz o obvio com os nomes e mostra() faz o obvio. Não é nada útil nem é boa prática. É só pra ter um exemplo. Então cada instância de sua classe tem essas variáveis e é importante entender isso.

 

Imagine esse programa

 

    class Program
    {

        static void Main(string[] args)
        {
            Cedidos teste = new Cedidos();
            teste.numera();
            teste.mostra();
            teste.valor = 122;
            teste.nome[0] = "Um Valor";
            teste.nome[1] = "Outro Valor";
            teste.mostra();
        }
    }

 

Ele tem uma função Main e então você pode rodar isso.

 

Veja a saida do programa

 

Sao 5 nomes:
    0 "[Nome 0...]"
    1 "[Nome 1...]"
    2 "[Nome 2...]"
    3 "[Nome 3...]"
    4 "[Nome 4...]"

Sao 5 nomes:
    0 "Um Valor"
    1 "Outro Valor"
    2 "[Nome 2...]"
    3 "[Nome 3...]"
    4 "[Nome 4...]"

 

Não serve para nada, apenas numera os nome[] e depois tenta mudar os dois primeiros e mostra de novo, apenas pra voce ver como funciona.

 

Eis o código todo:

 

using System.Xml.Linq;

namespace Aprendizado
{
    class Cedidos
    {
        public decimal valor;
        decimal principal;
        decimal pss;
        public string[] nome = new string[5];

        public void numera()
        {
            for (int i = 0; i < nome.Length; i += 1)
                nome[i] = $"[Nome {i}...]";
        }

        public void mostra()
        {
            Console.WriteLine($"Sao {nome.Length} nomes:");
            for (int i = 0; i < nome.Length; i += 1)
                Console.WriteLine($"    {i} \"{nome[i]}\"");
            Console.WriteLine("");
        }

    }

    class Program
    {

        static void Main(string[] args)
        {
            Cedidos teste = new Cedidos();
            teste.numera();
            teste.mostra();
            teste.valor = 122;
            teste.nome[0] = "Um Valor";
            teste.nome[1] = "Outro Valor";
            teste.mostra();

            teste.ToString();
        }
    }
}

 

Entenda: teste é uma instância de Cedidos. É uma distinção essencial, comum em java ou C# ou C++ ou Python por exemplo. Cedido é um objeto. teste é uma instância no exemplo

Postado
  Em 10/08/2023 às 17:39, cimerio7 disse:

Midori, não entendo , porque eu preciso colocar no escopo de uma função . as declarações das variáveis decimais estavam funcionando sem isso

Expandir  

 

Declarações não são atribuições. Não pode atribuir valores aí.

 

  Em 10/08/2023 às 16:55, Midori disse:

Faltou colocar a atribuição no escopo de uma função, p.ex,

 

Expandir  

 

Não, não foi isso @Midori. Ao escrever 

 

namespace aprendizado{
    internal class Cedidos{
        void teste(){
            decimal principal;
            decimal pss;
            string[] nome = new string[20];
                       
            nome[0] = "HELTON EDI XAVIER";
        }
    }
}

 

nome passou a ser outra coisa, variável local da função teste e não membro da classe Cedidos.

 

Outro exemplo

 

    class Cedidos
    {
        public static decimal valor = 17;
        decimal principal;
        decimal pss;
        public string[] nome = new string[3];
        public string[] numero = new string[] { "1","2","3" };
    }

 

Essa é a classe original. Veja que pode inicializar numero mas não pode atribuir valores a nome ou a qualquer outra variável ou vai receber o mesmo erro. 

 

Agora vejam essa classe Program

 

    class Program
    {

        static void Main(string[] args)
        {
            Cedidos.valor = 42; // static: um para todas instâncias
            Cedidos um = new Cedidos();
            Cedidos outro = new Cedidos();

            Console.Write($"   um: valor = {Cedidos.valor}  numeros: [ ");
            foreach (string n in um.numero) Console.Write($"{n} ");
            Console.WriteLine(" ]");

            Console.Write($"outro: valor = {Cedidos.valor}  numeros: [ ");
            foreach (string n in outro.numero) Console.Write($"{n} ");
            Console.WriteLine(" ]");

            outro.numero[2] = "X"; // muda apenas nessa instancia
            Cedidos.valor = 17; // muda em todas

            Console.WriteLine(
                $"\n    Agora Cedidos.valor = {Cedidos.valor}, " +
                $"outro.numero[2] = {outro.numero[2]}\n");

            Console.Write($"   um: valor = {Cedidos.valor}  numeros: [ ");
            foreach (string n in um.numero) Console.Write($"{n} ");
            Console.WriteLine(" ]");

            Console.Write($"outro: valor = {Cedidos.valor}  numeros: [ ");
            foreach (string n in outro.numero) Console.Write($"{n} ");
            Console.WriteLine(" ]");
        }
    }

 

E o resultado

 

   um: valor = 42  numeros: [ 1 2 3  ]
outro: valor = 42  numeros: [ 1 2 3  ]

    Agora Cedidos.valor = 17, outro.numero[2] = X

   um: valor = 17  numeros: [ 1 2 3  ]
outro: valor = 17  numeros: [ 1 2 X  ]

 

E a diferença: valor é static então é um campo só para todas as instâncias. Mudou em um mudou em todas.

 

Mas cada instância tem seu array numero.

 

O "programa" todo

 

namespace ClubeDoHardware
{
    class Cedidos
    {
        public static decimal valor = 17;
        decimal principal;
        decimal pss;
        public string[] nome = new string[3];
        public string[] numero = new string[] { "1","2","3" };
    }

    class Program
    {
        static void Main(string[] args)
        {
            Cedidos.valor = 42; // static tem instancia unica
            Cedidos um = new Cedidos();
            Cedidos outro = new Cedidos();

            Console.Write($"   um: valor = {Cedidos.valor}  numeros: [ ");
            foreach (string n in um.numero) Console.Write($"{n} ");
            Console.WriteLine(" ]");

            Console.Write($"outro: valor = {Cedidos.valor}  numeros: [ ");
            foreach (string n in outro.numero) Console.Write($"{n} ");
            Console.WriteLine(" ]");

            outro.numero[2] = "X"; // muda apenas nessa instancia
            Cedidos.valor = 17; // muda em todas

            Console.WriteLine(
                $"\n    Agora Cedidos.valor = {Cedidos.valor}, " +
                $"outro.numero[2] = {outro.numero[2]}\n");

            Console.Write($"   um: valor = {Cedidos.valor}  numeros: [ ");
            foreach (string n in um.numero) Console.Write($"{n} ");
            Console.WriteLine(" ]");

            Console.Write($"outro: valor = {Cedidos.valor}  numeros: [ ");
            foreach (string n in outro.numero) Console.Write($"{n} ");
            Console.WriteLine(" ]");
        }
    }
}

 

 

  Em 10/08/2023 às 19:58, cimerio7 disse:

pelo jeito o livro está ultrapassado, é realmente um livro antigo

Expandir  

 

  Em 10/08/2023 às 20:02, mauro_b disse:

Ok! Experimente algo: apague aquela linha e observe, se o erro sumiu, então sua conclusão está correta. O livro pode estar sim!

Expandir  

 

Linguagens não mudam em coisas assim básicas. E C# é linguagem da Microsoft, associada ao .Net com milhões de usuários corporativos. A compania não deixa isso acontecer. Veja por exemplo as décadas em que ainda se pode usar programas escritos para Windows 95. E o admitido atraso que a necessidade de compatibilidade gerou no desenvolvimento do Windows. 

 

E qual o livro afinal? E o que exatamente estava escrito no livro no trecho que copiou para seu programa?

 

  • Curtir 1
Postado
  Em 11/08/2023 às 03:34, arfneto disse:

Não, não foi isso @Midori. Ao escrever 

 

Expandir  

Para artibuição como ele colocou foi isso. Outra forma é como você demonstrou sobre inicializar. No exemplo eu poderia ter deixado as variáveis como membro da classe, mas isso não é relevante para o que eu quis comentar especificamente sobre o erro na forma como ele atribuiu.

Postado

@Midori o erro não está "na forma como ele atribuiu" mas sim "a que ele atribuiu". Não se pode atribuir valores a uma classe. Apenas a uma instância. 

 

É essencial entender essa diferença, em C++, C#, java, python, javascript ou qualquer linguagem orientada a objetos... Isso foi o que tentei te dizer. E mostrei dois exemplos e argumentos. 

Mudar o contexto da atribuição não é solução porque o erro está justamente no contexto.

[off-topic] em javascript se diria que nome é propriedade do objeto,  por exemplo.

Postado

A razão da mensagem de erro  que gerou o tópico está em tentar atribuir valores a uma variável membro da classe e não a uma instância da classe. Eu expliquei isso e deixei dois exemplos comentados e com a saída e os argumentos pra entender, @mauro_b

 

  Em 12/08/2023 às 09:05, mauro_b disse:

E daí?

Expandir  

 

Repetir meu comentário sem contexto não parece ajudar. 

 

Eu estava me referindo ao que escreveram você e @cimerio7 sobre ser a razão da mensagem ser uma mudança na linguagem, e um livro desatualizado. Para ajudar, vou repetir o contexto aqui:

 

  Em 10/08/2023 às 19:58, cimerio7 disse:

pelo jeito o livro está ultrapassado, é realmente um livro antigo

Expandir  

 

  Em 10/08/2023 às 20:02, mauro_b disse:

Ok! Experimente algo: apague aquela linha e observe, se o erro sumiu, então sua conclusão está correta. O livro pode estar sim!

Expandir  

 

E aí eu escrevi, citando essas afirmações, que

 

  Em 11/08/2023 às 03:34, arfneto disse:

Linguagens não mudam em coisas assim básicas. E C# é linguagem da Microsoft, associada ao .Net com milhões de usuários corporativos. A compania não deixa isso acontecer. Veja por exemplo as décadas em que ainda se pode usar programas escritos para Windows 95. E o admitido atraso que a necessidade de compatibilidade gerou no desenvolvimento do Windows. 

 

E qual o livro afinal? E o que exatamente estava escrito no livro no trecho que copiou para seu programa?

Expandir  

 

Ainda sobre essa afirmação

 

  Em 10/08/2023 às 20:02, mauro_b disse:

Ok! Experimente algo: apague aquela linha e observe, se o erro sumiu, então sua conclusão está correta. O livro pode estar sim!

Expandir  

 

Você tem toda razão: se apagar a linha da atribuição o erro desaparece mesmo! Mas não é assim uma surpresa.

Postado

@arfneto Compreender essa diferença que comentou é importante. Mas entendo que não mudei o contexto, se foi o que quis dizer... Aquela linha foi colocada ali indevidamente e me parece adequado mostrar um exemplo de onde podia ficar.

Postado
  Em 12/08/2023 às 20:18, Midori disse:

Mas entendo que não mudei o contexto, se foi o que quis dizer... Aquela linha foi colocada ali indevidamente e me parece adequado mostrar um exemplo de onde podia ficar

Expandir  

 

Me desculpe, acho que não me expressei bem.

 

Reescrevendo:

 "aquela linha" é uma atribuição. Essa atribuição:
 

  Em 10/08/2023 às 14:04, cimerio7 disse:
 nome[0] = "HELTON EDI XAVIER";
Expandir  


Ao sugerir --- como você escreveu --- colocar isso dentro de uma função, você muda totalmente o contexto do fato. E a mensagem do compilador deixa de aparecer. Faz sentido. Mas não acrescenta nada. Não resolveu nada. Se colocar isso em um programa em C++ também vai funcionar. Mas se for na definição da classe não vai funcionar, de mesmo modo.

 

Se você acha "adequado mostrar um exemplo de onde podia ficar" não posso discutir. É uma opinião possível. Mas acho que não acrescenta muito, se algo. É uma atribuição. Só isso. 

 

E não pode ser usada lá pelas razões que expliquei. Pode ver a diferença nos programas que mostrei: note no exemplo que há DUAS instâncias para a mesma classe e a saída do exemplo ...

image.png.58d893843260a9b01d57e59fb817fee1.png

 

mostra que cada instância tem seus valores e fica claro porque não cabe uma atribuição no contexto da pergunta do autor...

 


 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Mostrar mais  

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Mostrar mais  
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!