Ir ao conteúdo
  • Cadastre-se

C# erro na declaracao de array


cimerio7
Ir à solução Resolvido por Ansi C,

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

@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
Link para o comentário
Compartilhar em outros sites

2 horas atrás, 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";

 

@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
Link para o comentário
Compartilhar em outros sites

43 minutos atrás, 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";
        }
    }
}

 

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 

Link para o comentário
Compartilhar em outros sites

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.

 

3 horas atrás, cimerio7 disse:

estou com esse erro simples

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

Link para o comentário
Compartilhar em outros sites

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

2 horas atrás, 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.

mauro, no livro está exatamente assim. 

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

9 horas atrás, 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

 

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

 

10 horas atrás, Midori disse:

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

 

 

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(" ]");
        }
    }
}

 

 

7 horas atrás, cimerio7 disse:

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

 

7 horas atrás, 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!

 

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
Link para o comentário
Compartilhar em outros sites

8 horas atrás, arfneto disse:

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

 

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.

Link para o comentário
Compartilhar em outros sites

@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.

Link para o comentário
Compartilhar em outros sites

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

 

5 horas atrás, mauro_b disse:

E daí?

 

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 16:58, cimerio7 disse:

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

 

Em 10/08/2023 às 17: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!

 

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

 

Em 11/08/2023 às 00: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?

 

Ainda sobre essa afirmação

 

Em 10/08/2023 às 17: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!

 

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

Link para o comentário
Compartilhar em outros sites

34 minutos atrás, 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

 

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

 

Reescrevendo:

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

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


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...

 


 

Link para o comentário
Compartilhar em outros sites

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

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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!